Când creăm un proiect nou în Spring Boot, există acum opțiunea Spring Boot 4.0.0 preview, așa cum se vede în imaginea de mai jos:
Fig 1. Spring Boot
Spring Boot 4 reprezintă un salt major în modernizarea modului în care aplicațiile Spring sunt dezvoltate, configurate și livrate. Spring este acum mai modular și mai extensibil ca niciodată.
Pentru început, cerințele: pentru a rula Spring Boot 4 ai nevoie de Java17, sau Kotlin v2.2 și Spring framework 7.x.
În versiunile anterioare de Spring Boot, starterele precum spring-boot-starter-web erau monolitice: includeau un număr mare de dependințe, chiar și atunci când nu aveai nevoie de ele. Acest lucru putea face aplicația mai grea și mai lentă la build sau start-up.
Acum avem module mai mici, mai bine focalizate, doar pentru funcționalitățile necesare.
Poți combina module după nevoie, în loc să folosești un starter mare.
Rezultat: JAR-uri mai mici, start-up mai rapid.
Controlezi exact ce este inclus în aplicație.
Reduce timpul de pornire și consumul de memorie.
Exemplu:
Doar pentru suport HTTP:
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-http
</artifactId>
</dependency>
Doar pentru suport JSON:
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-json
</artifactId>
</dependency>
Spring Boot 4 folosește jakarta. (înlocuind javax.). Asigură conformitate cu standardele moderne și se aplică la: Servlets, JPA, WebSocket, CDI.
Exemplu:
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
@Entity
public class User {
@Id
private Long id;
private String name;
}
În proiectele modulare, uneori folosim tipuri interne sau clase de bază aflate în module diferite, unde codul sursă nu este disponibil la build. Marcând o clasă cu @ConfigurationPropertiesSource, nu mai trebuie să ne facem griji legate de metadatele lipsă. Procesorul se ocupă automat de generarea lor.
design modular mai curat;
suport îmbunătățit în IDE (autocompletare, validare etc.) .
Exemplu:
import org.springframework.boot.context
.properties.ConfigurationProperties;
import org.springframework.context
.annotation.Configuration;
@Configuration
@ConfigurationProperties(prefix = "app.db")
public record DatabaseProperties(String url,
String user, String pass, int poolSize) { }
Endpointul de SSL health din Spring Boot a fost îmbunătățit pentru a oferi rapoarte mai precise. Statusul will_expire_soon status a fost eliminat. Certificatele sunt afișate ca valide până în momentul în care chiar expiră. A fost adăugat un câmp nou numit expiringChains pentru a urmări certificatele care se apropie de expirare. Aceste schimbări face ca echipele să monitorizeze mai ușor validitatea certificatelor SSL fără a da de alarme false.
Exemplu:
// application.yml
management:
endpoints:
web:
exposure:
include: "health,info"
health:
ssl:
enabled: true
Adnotările vechi din librăria org.springframework.lang precum: @Nullable, @NonNull, @NonNullApi, și @NonNullFields sunt deprecated în Spring Framework 7. Acestea au fost înlocuite de adnotările JSpecify, noul standard recomandat. Aceste adnotări se aplică pentru parametri, tipuri de returnare, câmpuri și utilizări ale tipurilor, îmbunătățind claritatea.
Example:
//Stilul vechi
import org.springframework.lang.Nullable;
import org.springframework.lang.NonNull;
//Stilul nou
import org.jspecify.annotations.Nullable;
import org.jspecify.annotations.NonNull;
@NullMarked
public class UserService {
public @NonNull User createUser(
@Nullable String name) {
return new User(name != null ? name :"Anonymous");
}}
Spring Framework 7 introduce interfața BeanRegistrar, care permite înregistrarea dinamică de beanuri cu logică runtime, bucle sau condiții. Aceasta oferă o abordare mai flexibilă pentru înregistrarea unui bean.
Există diverse beneficii ale înregistrării programatice a beanului, de exemplu, acestea se pot face pe baza unor condiții de execuție, cum ar fi profilurile active.
Exemplu:
public class MyBeanRegistrar implements BeanRegistrar {
@Override
public void register(BeanRegistry reg,
Environment env) {
reg.registerBean("user", User.class);
if (env.matchesProfiles("dev")) {
reg.registerBean("order", Order.class,
spec -> spec.supplier(
ctx -> new Order("order_1)));
}
}
}
@Configuration
@Import(MyBeanRegistrar.class)
public class AppConfig { }
Această nouă actualizare introduce suport simplificat pentru versionarea API-ului prin adnotări. Acest lucru simplifică întreținerea API-ului. Pentru a folosi versionarea, mai întâi, trebuie să furnizați ApiVersionStrategy:
Exemplu:
import org.springframework.context
.annotation.Configuration;
import org.springframework.web.servlet
.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfiguration
implements WebMvcConfigurer {
@Override
public void configureApiVersioning(
ApiVersionConfigurer cfg) {
cfg.useRequestHeader("API-Version");
}
}
@RestController
@RequestMapping("/api/products")
public class ProductController
{
@RequestMapping(value = "/search", version="1")
public List searchV1(
@RequestParam String query){…}
@RequestMapping(value = "/search", version="2")
public List searchV2(
@RequestParam String query, @RequestParam(defaultVaule = "10") int limit){
…}
}
Permite definirea de clienți HTTP ca interfețe și reduce codul pentru apelurile API REST eliminând necesitatea configurării manuale a RestTemplate sau WebClient. Este integrat cu dependency injection. De asemenea, este sigur din punct de vedere al tipurilor: semnăturile metodelor se potrivesc exact cu API-ul dvs. și sunt ușor de testat deoarece interfețele pot fi simulate în teste.
Spring Boot 4 include Micrometer 2.0 și Actuator îmbunătățit. Poți instrumenta aplicația folosind Micrometer Observation API, o singură abstracție pentru a produce metrici, tracing și loguri.
Exemplu:
# application.yml
management:
endpoints:
web:
exposure:
include: "*"
metrics:
enable:
all: true
Spring Boot 4 suportă Java virtual threads, iar acest lucru face ca operațiunile care se pot bloca, precum apelurile HTTP sau interogările DB să fie mai scalabile, fără costurile tradiționale ale poolului de threaduri.
Exemplu:
@Configuration
public class ExecutorConfig {
@Bean
public TaskExecutor taskExecutor() {
SimpleAsyncTaskExecutor ex=
new SimpleAsyncTaskExecutor("virtualThread");
executor.setVirtualThreads(true);
return executor;
}
}
Spring Security 7 integrat în Spring Boot 4 oferă suport modern (OAuth2, OpenID Connect) și un stil nou de configurare pentru filter chain.
Exemplu:
@Configuration
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(
HttpSecurity http) throws Exception {
http.authorizeHttpRequests(auth -> auth
.requestMatchers("/public/**").permitAll()
.anyRequest().authenticated()
)
.formLogin()
.and()
.httpBasic();
return http.build();
}
}
Spring Boot 4 îmbunătățește suportul pentru compilarea imaginilor native cu GraalVM: start-up mult mai rapid și consum mai mic de memorie. Compilarea imaginilor este în mare parte automatizat cu procesarea AOT din Spring.
Următoarele au fost eliminate în noua versiune:
Namespace-ul de configurare XML pentru Spring MVC este acum deprecated în favoarea lui Java Config.
Suportul pentru JUnit 4 în cadrul Spring Test Context Framework este deprecated, se utilizează Junit 5
Suportul pentru Jackson 2.x este deprecated în favoarea Jackson 3.x.
Spring Boot 4 este o actualizare modernă, care se aliniază cu viitorul dezvoltării proiectelor în Java. După lansarea versiunii stabile, pentru proiectele noi, este alegerea clară, iar pentru proiectele existente, migrarea oferă multe îmbunătățiri, modularitate și observabilitate mai bună.
Referințe:
https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-4.0-Migration-Guide
https://foojay.io/today/preparing-for-spring-framework-7-and-spring-boot-4/
https://medium.com/@aamernabi/whats-new-in-spring-boot-4-0-a-look-ahead-ff50b8b28d84