actu-image
Software engineering - 29 Oct 2025

Spring Boot 4 : Tout Comprendre, des Nouveautés à la Migration Complète

Image vignette
Abdelaziz Louarit

Article rédigé par Abdelaziz LOUARIT,
Développeur Java chez MARGO.

Introduction


Spring Boot 4 marque une étape importante pour l’écosystème Java moderne.
Après plusieurs années de stabilisation autour de Spring Boot 3, cette nouvelle version poursuit trois objectifs : simplifier la vie des équipes, consolider les bonnes pratiques cloud-native et accélérer encore le démarrage et l’observabilité.

Basé sur Spring Framework 7.x, il consolide les avancées des versions précédentes tout en introduisant des fonctionnalités natives dédiées à la résilience, l’observabilité et la performance.

Aligné sur Java 17 (LTS) désormais requis comme minimum et sur Jakarta EE 11, Spring Boot 4 vise clairement les applications cloud-native et serverless, avec une réduction notable des dépendances externes, une null-safety intégrée via JSpecify, et un support optimisé pour l’AOT (Ahead-of-Time) ainsi que pour les images natives GraalVM.

Cette version met l’accent sur la simplicité et la cohérence : moins de configurations implicites, des comportements plus clairs et une meilleure préparation pour les environnements conteneurisés et à démarrage rapide.

Par rapport à Spring Boot 3 (Java 17 / Jakarta EE 10), les benchmarks officiels annoncent jusqu’à 50 % de gain sur le temps de démarrage en mode natif et une réduction de 30 à 40 % de la consommation mémoire.

Ce guide propose une analyse complète et actualisée de Spring Boot 4 :
  • les nouveautés phares et leur mise en œuvre concrète ;
  • un comparatif détaillé avec Spring Boot 3 ;
  • un guide de migration pas à pas;
  • une checklist exhaustive de migration ;
  • et une FAQ technique enrichie.

Nouveautés utiles en production

Résilience intégrée : @Retryable et @ConcurrencyLimit

Auparavant gérée via Spring Retry (ou Resilience4j), la résilience est maintenant native dans Spring Boot 4. Ces annotations s'appuient sur Project Reactor pour les backoffs et intègrent Micrometer pour le monitoring.


import org.springframework.retry.annotation.Retryable;
import org.springframework.retry.annotation.Backoff;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
import org.springframework.service.annotation.ConcurrencyLimit; // Nouveau dans spring-boot 4

@Service
public class PaymentService {

    @Retryable(
        maxAttempts = 4, // Inclut la tentative initiale
        backoff = @Backoff(delay = 1000, multiplier = 2.0), // Backoff exponentiel avec jitter
       
    @ConcurrencyLimit(value = 5) 
    public void processPayment(String paymentId) {
        // Logique : appel externe (e.g., RestTemplate ou WebClient)
        externalApi.call(paymentId);
    }
}
Figure 1 – Service résilient en Spring Boot 4 (retries + limite de concurrence).

Les annotations @Retryable et @ConcurrencyLimit permettent de :

  • Réessayer automatiquement un appel en cas d’échec transitoire,
  • Limiter le nombre d’appels simultanés sur un endpoint critique.

Versioning d’API natif


Le versioning devient explicite au niveau des mappings : plus besoin de dupliquer les contrôleurs ou de multiplier les chemins. Cela réduit la dette technique et clarifie l’évolution des contrats.


import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.GetMapping;
import java.util.List;

@RestController
@RequestMapping("/api")
public class UserController {

    @GetMapping(path = "/users", version = "1", produces = "application/vnd.app.v1+json")
    public List getUsersV1() { return List.of(new UserV1("Alice", "ADMIN")); }

    @GetMapping(path = "/users", version = "2", produces = "application/vnd.app.v2+json")
    public List getUsersV2() { return List.of(new UserV2("Alice", "ADMIN", 30)); } // Ajout champ 'age'
}
Figure 2 – Versioning d’API natif : un seul contrôleur, endpoints cohérents.

Configurez spring.mvc.versioning.strategy=header dans application.yml.


spring:
  mvc:
    versioning:
      strategy: header
Figure 3 – Configuration Spring pour versioning par en-tête.

Null‑safety (JSpecify)

Les annotations de nullité rendent les contrats explicites : paramètre obligatoire, valeur optionnelle, retour nullable. Les IDE s’appuient dessus pour prévenir les NPE et guider l’autocomplétion.


import org.jspecify.annotations.NonNull;
import org.jspecify.annotations.Nullable;

public final class EmailService {

    public void send(@NonNull String to, @Nullable String cc, @NonNull String body) {
        java.util.Objects.requireNonNull(to); // Compile-time check via plugins
        // ...
    }
}

Figure 4 – Contrat explicite via annotations de nullité.

Performances : AOT & builds natifs (GraalVM)

Le démarrage plus rapide et l’empreinte mémoire réduite deviennent des objectifs de premier ordre. Spring Boot 4 renforce l’intégration AOT et simplifie l’usage de GraalVM. AOT compile les beans au build-time, réduisant le startup de 90% en native. Configuration Maven enrichie :


 <plugin>
    <groupId>org.graalvm.buildtools</groupId>
    <artifactId>native-maven-plugin</artifactId>
    <version>0.10.3</version> <!-- Version alignée Boot 4 -->
    <executions>
        <execution>
            <goals><goal>compile</goal><goal>build</goal></goals>
            <phase>package</phase>
        </execution>
    </executions>
    <configuration>
        <imageName>myapp</imageName>
        <buildArgs>--no-fallback --initialize-at-build-time</buildArgs>
    </configuration>
</plugin>
Figure 5 – Configuration Maven pour build natif.

Actuator enrichi (Readiness/Liveness, SSL, Mongo)

Les endpoints de santé sont plus standards : readiness/liveness activés par défaut, de nouveaux indicateurs facilitent la supervision et l’intégration Kubernetes.


management:
  endpoints:
    web:
      exposure:
        include: health,info,metrics,env  
   endpoint:
    health:
      probes:
        enabled: true      
     show-details: always 
    ssl:
      enabled: true
Figure 6 – Probes et vérification SSL.

Jackson 3 & Jakarta EE 11

Le passage à Jackson 3 et la bascule complète vers `jakarta.*` modernisent l’écosystème. Effet de bord : certaines bibliothèques tierces nécessitent une mise à jour. Anticipez ce sujet tôt dans la migration.


import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Email;

public record CreateUserRequest(@NotBlank String name, @Email String email) {}
Figure 7 – DTO Jakarta (record Java).

Migration vers Spring Boot 4

Comparatif rapide Spring Boot 3 → 4

Aspect Spring Boot 3.x Spring Boot 4.x
Java Minimum 17 17
JSON Binding Jackson 2.15 Jackson 3.0 support natif des records et meilleure perf de sérialisation
Résilience Via dépendance externe Spring Retry Intégrée nativement : @Retryable, @ConcurrencyLimit
Null-Safety Optionnelle via libs externes Intégrée JSpecify
EE Specs Jakarta EE 10 Jakarta EE 11 (entièrement retiré)
AOT/GraalVM Expérimental, builds instables Stabilisé : démarrage 2× plus rapide, empreinte –40 %
Actuator Probes Configuration manuelle (readiness/liveness) Activées par défaut, prêtes pour Kubernetes
Observabilité Basique (Micrometer, Prometheus) Intégration OpenTelemetry (OTel) complète : traces, logs, métriques
Packaging / Build Image Docker classique Support natif GraalVM et build tooling Maven plus simple
Dépréciations Quelques (e.g., @ConstructorBinding) Metadata enrichi, autocomplétion IDE améliorée
Fréquence de mise à jour Faible Haute

Guide de migration concret Spring Boot 4

Basé sur le guide officiel : Guide Migration - Spring Boot 4.0

Phase 1 — Préparer le terrain

  • Passez sur Java 17 (ou une version ultérieure) et Spring Boot 3.3.5 ; corrigez les dépréciations.
  • Exécutez ./mvnw dependency:tree | grep javax pour identifier les dépendances résiduelles en javax.*.
  • Corrigez dépréciations via IDE (e.g., replace javax.validation par jakarta.validation).
  • Mettez à jour les drivers, starters et libs critiques.
  • Mesurez les performances actuelles (temps de démarrage via time java -jar, consommation mémoire avec JFR) pour servir de référence lors des comparaisons post-migration.

Phase 2 — Tester Milestones/RC

  • Créez une branche dédiée à la migration et basculez le BOM vers 4.0.0-M*.
  • Mettez à jour les dépendances et compilez ; fixez les breaks Jakarta/Jackson via IDE.
  • Corrigez progressivement les imports, mettez à jour vos starters et exécutez tous les tests.
  • Identifiez et corrigez les API supprimées ou dépréciées.
  • Validez la compatibilité avec Jackson 3, Spring Security, Hibernate et la sérialisation JSON (tests unitaires et integration).
  • Comparez les métriques AOT (démarrage, mémoire) à la référence initiale pour détecter les régressions.

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>4.0.0-RC2</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
Figure 8 – BOM Spring Boot 4 RC.

Phase 3 — Passer en General Availability

  • Passez sur 4.0.0 (GA).
  • Retirez les dépendances obsolètes (Spring Retry si vous adoptez les annotations natives).
  • Revalidez vos endpoints exposés (Actuator, sécurité).
  • Déployez-en staging, monitorez avec Micrometer/Prometheus puis en production progressive.

Phase 4 — Optimiser

  • Intégrez Micrometer pour tracer retries, succès et erreurs (ex. : counters sur @Retryable) ; exportez vers Prometheus.
  • Comparez avant/après : Mesurez gains (démarrage, mémoire via JFR/JMeter) vs référence initiale ; calculez deltas % pour valider l'impact.
  • Documentez et partagez les retours d’expérience.

Checklist de migration (avant prod)

  • Java 17 (ou une version ultérieure) sur tous les environnements
  • Plus aucune dépendance javax.*
  • Libs mises à jour pour Jackson 3 (HATEOAS, MapStruct, Lombok, Hibernate…)
  • Propriétés YAML revues (renommages éventuels)
  • Résilience native activée / Spring Retry retiré
  • Actuator vérifié (+ probes actives)
  • Tests d’intégration et charge OK
  • AOT/GraalVM testé si cible natif

Glossaire des acronymes

  • AOT (Ahead-Of-Time) : compilation anticipée du code Java avant exécution, réduisant le temps de démarrage et la consommation mémoire.
  • GraalVM : machine virtuelle optimisée permettant la création d’exécutables natifs et l’exécution multi-langages (Java, Python, etc.).
  • Otel (OpenTelemetry) : standard ouvert pour la collecte, le traçage et la centralisation des métriques, logs et traces d’applications.

Conclusion

Spring Boot 4 consolide l'écosystème Java pour le cloud-native : résilience native, observabilité avancée via Open Telemetry (OTEL), et optimisations AOT/GraalVM qui réduisent drastiquement l'empreinte (jusqu'à -40% mémoire en natif, per benchmarks officiels). En migrant étape par étape – de la préparation en 3.3.x à l'optimisation fine – vous minimisez les risques tout en adoptant des standards modernes comme Java 21 (dont les Virtual Threads), Jakarta EE 11, Jckson 3 et une observabilité unifiée.

Au final, cette version transforme vos apps en systèmes plus prédictibles, scalables et maintenables, avec moins de dépendances externes et plus de focus sur le métier. Les efforts paient :

  • Robustesse accrue face aux failures transitoires (retry/backoff, limites de concurrence),
  • Monitoring unifié (traces, métriques, logs via OTel) et health checks standardisés,
  • Performances prêtes pour le serverless (démarrages plus rapides, empreinte réduite, images natives).

Spring Boot 4 n’est pas une rupture, c’est une mise à niveau stratégique : un socle moderne pour des applications Java durables, rapides et observables — prêtes pour le multi-cloud et les contraintes de production de 2025 (et au-delà).


Pour compléter vos connaissances et rester à jour sur Java, découvrez notre article Java 25 – ce qu'il faut retenir.

FAQ – Questions fréquentes sur la migration vers Spring Boot 4


Q : Faut-il migrer tous les services ?
R : Non, adoptez une approche incrémentale par domaine métier (strangler pattern). Priorisez les services critiques ou nouveaux modules pour tester les gains AOT et de performance GraalVM.


Q : Peut-on rester en 3.x ?
R : Spring Boot 3.3.x atteint la fin de son support OSS en juin 2025 et Spring Boot 3.5.x est encore supportée jusqu’au 30 juin 2026. Anticipez la transition pour :

  • Jackson 3, qui devient la norme par défaut,
  • Jakarta EE 11, pour la compatibilité future,
  • et la sécurité, car les patches cesseront à la fin du support LTS.


Q :AOT/GraalVM est-il obligatoire ?
R : Non. Ciblez les workloads où le ROI est avéré : serverless, edge computing, microservices à démarrage fréquent, etc.


Q : Null-safety impose-t-elle des refactors lourds ?
R : Non, commencez par modules critiques et faites une adoption incrémentale.


Q : Quels impacts sur Spring Cloud ?
R : La compatibilité est assurée avec Spring Cloud 2024.x (Dalston), mais l’upgrade nécessite le passage à Jakarta EE 11. Testez vos circuit breakers et vos flux de résilience : ils s’appuient désormais sur les annotations natives @Retryable et @ConcurrencyLimit.