TSM - Spring Boot 4: ce este nou, ce urmează?

Bianca Moga - Software Developer

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.

Startere Modulare

Î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.

Beneficii:

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>

Jakarta EE 11+

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;
}

Metadate îmbunătățite pentru Configuration Properties

Î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.

Beneficii:

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) { }

Îmbunătățiri în SSL Health Reporting

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

Îmbunătățiri pentru Null-Safety

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");
}}

Înregistrarea Programatică a Bean-urilor

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 { }

Suport pentru versionarea API-urilor

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){
   …}  
}

Client HTTP Declarativ (@HttpExchange)

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.

Integrări Micrometer / Actuator

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

Virtual Threads

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

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();
 }
}

Suportul GraalVM îmbunătățit

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.

Funcționalități eliminate și alternativele lor

Următoarele au fost eliminate în noua versiune:

  1. Namespace-ul de configurare XML pentru Spring MVC este acum deprecated în favoarea lui Java Config.

  2. Suportul pentru JUnit 4 în cadrul Spring Test Context Framework este deprecated, se utilizează Junit 5

  3. Suportul pentru Jackson 2.x este deprecated în favoarea Jackson 3.x.

  4. Spring JCL se va utiliza Apache Commons Logging

Concluzie

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:

  1. https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-4.0-Migration-Guide

  2. https://foojay.io/today/preparing-for-spring-framework-7-and-spring-boot-4/

  3. https://medium.com/@aamernabi/whats-new-in-spring-boot-4-0-a-look-ahead-ff50b8b28d84

  4. https://medium.com/@DevTrendsDaily/10-new-features-of-spring-boot-4-that-actually-matter-for-production-f8f8aceb9a17

  5. https://calendar.spring.io/?ref=hackernoon.com

  6. https://blog.stackademic.com/spring-boot-4-released-a-full-analysis-of-11-major-changes-c98bda2bb358