Nouveautés de Spring 6
Introduction
Spring et Spring Boot ont changé de version majeure, ce qui est rare et s’accompagne généralement de grandes ruptures. Il faut absolument migrer les applications et les tester, car de nombreux changements ont eu lieu.
Passage à Java 17
Bien que le support de Java 17 ait été préexistant, il est maintenant devenu la référence en tant que version LTS. Lorsqu’il s’agit de migrer à partir de la version LTS 11, les développeurs Java auront l’occasion de tirer parti des nouvelles fonctionnalités du langage. Cependant, nous allons nous pencher sur les fonctionnalités les plus cruciales pour les développeurs travaillant avec Spring Boot.
1. Les record(s)
Les record(s) Java (JEP 395) ont été introduits pour simplifier la création de classes servant de conteneurs de données, appelées également POJO (Plain Old Java Objects) ou DTO (Data Transfer Objects).
Un exemple d’enregistrement est le suivant :
public record Personne (String nom, String adresse) {}
Cependant, il est important de faire preuve de prudence lors de leur utilisation avec la validation Bean, car les contraintes de validation ne sont pas prises en charge sur les arguments du constructeur, notamment lors de la désérialisation JSON (utilisation de Jackson) et de leur passage en tant que paramètres dans les méthodes des contrôleurs.
2. Blocs de texte
La JEP 378 permet désormais de créer des blocs de texte multilignes sans avoir besoin de concaténer des chaînes lors de sauts de ligne :
String blocTexte = """ ...
Jakarta EE 9
Le passage de Java EE à Jakarta EE 9 est la modification la plus significative, avec un changement d’espace de noms du package de javax.* à jakarta.*. Il est nécessaire d’ajuster les importations dans le code lors de l’utilisation de classes de Java EE. Par exemple, remplacez :
mport javax.servlet.http.HttpServletRequest;
par :
import jakarta.servlet.http.HttpServletRequest;
Cette modification affecte également les bibliothèques externes dépendantes de Java/Jakarta EE, telles que Hibernate Validator 7+, Tomcat 10+ et Jetty 11+, ce qui impose de rester à jour sur de nombreuses bibliothèques pour garantir la compatibilité et le bon fonctionnement des applications.
Dépendances supplémentaires
Spring Framework 6 et Spring Boot 3 nécessitent les versions minimales suivantes :
-
Lombok 1.18.22+ (avec prise en charge de JDK 17) ;
-
Gradle 7.3+;
-
SnakeYAML 2.0;
-
Jackson 2.14;
-
Kotlin Coroutines 1.7;
-
Kotlin Serialization 1.5.
Points d’intérêts
Les principaux avantages sont les exécutables natifs et l’observabilité. L’initiative Spring Native est intégrée à Spring pour faciliter la création d’exécutables natifs. L’observabilité est renforcée grâce à Spring Observability, basé sur Micrometer et Micrometer Tracing.
Petites modifications dans Spring Web MVC
Le support de RFC7807 (standard des détails des problèmes) est désormais inclus dans Spring Web MVC, éliminant le besoin de bibliothèques externes comme Zalando Problem. HttpMethod n’est plus une énumération, mais une classe permettant de créer des instances pour des méthodes HTTP étendues.
Migration du code vers la version 6 de Spring-core
Il y a pour le moment deux montés de versions à faire, celle vers Spring 6.0 puis celle vers Spring 6.1.
1. Mise à niveau vers la version 6.0
a. Conteneur de base
Dans le passage à la version 6.0, certaines annotations telles que @Inject basées sur JSR-330 sont désormais situées dans jakarta.inject, et les annotations correspondantes @PostConstruct et @PreDestroy basées sur JSR-250 se trouvent dans jakarta.annotation. Pour une compatibilité ascendante avec 5.3.x, Spring continue de détecter les équivalents javax. Pour une utilisation avancée de JavaBeans, vous pouvez spécifier le contenu dans un fichier META-INF/spring.factories pour activer l’utilisation complète de java.beans.Introspector dans le style 5.3.
Si vous préférez rester sur Spring Framework 5.3.x, voici quelques points importants à prendre en compte.
Pour forcer la compatibilité ascendante avec la détermination des propriétés au style 6.0 et améliorer les performances de l’introspection, vous pouvez utiliser un fichier META-INF/spring.factories personnalisé avec la configuration suivante :
org.springframework.beans.BeanInfoFactory=org.springframework
.beans.SimpleBeanInfoFactory
LocalVariableTableParameterNameDiscoverer est désormais déprécié et générera un avertissement chaque fois qu’il tentera de résoudre les noms de paramètres avec succès (ceci se produit uniquement lorsque StandardReflectionParameterNameDiscoverer n’a pas trouvé les noms). Pour éviter cet avertissement, compilez vos sources Java avec le drapeau -parameters Java 8+ commun au lieu de compter sur le drapeau -debug du compilateur. Si vous utilisez Kotlin, il est recommandé d’utiliser le drapeau -java-parameters.
LocalValidatorFactoryBean repose désormais sur la résolution standard des noms de paramètres dans Bean Validation 3.0. Si vous utilisez les noms de paramètres dans votre configuration de Bean Validation, assurez-vous de compiler vos sources Java avec le drapeau -parameters Java 8+.
ListenableFuture a été déprécié en faveur de CompletableFuture. Vous devriez envisager de migrer vers...
Migration vers Spring Boot 3
Nous pouvons repérer nos mauvaises habitudes et les endroits où nous avons accumulé de la dette technique à travers la mise en œuvre de cette migration.
Avant de migrer vers Spring Boot 3, nous devons vérifier que nos sources sont bien alignées sur la dernière version de Spring 2.7.18 (ou plus récent si ça existe). Cette étape garantira que nous travaillons avec les dépendances les plus récentes de cette branche.
Nous pouvons migrer d’abord vers Spring Boot 3.0.0 puis vers la dernière version.
1. Phases préparatoires
a. Examen des dépendances
La transition vers Spring Boot 3.0 provoque des mises à jour de plusieurs dépendances et peut nécessiter des ajustements de notre part. Nous pouvons comparer la gestion des dépendances entre la version 2.7.x et la version 3.0.x pour évaluer l’impact de cette mise à jour sur notre projet.
Il est possible que nous utilisions également des dépendances non gérées par Spring Boot (par exemple, Spring Cloud). Puisque notre projet définit des versions explicites pour ces dépendances, nous devons d’abord identifier les versions compatibles avant de procéder à la mise à niveau.
b. Mise à niveau vers Spring Security 6.0
Spring Boot 3.0 est livré avec Spring Security 6.0. Pour faciliter cette mise à niveau, l’équipe Spring Security a publié Spring Security 5.8. Avant d’envisager la mise à niveau vers Spring Boot 3.0, nous devrions envisager de mettre à jour notre application Spring Boot 2.7 vers Spring Security 5.8. Nous pouvons utiliser le guide de migration de Spring Security pour nous aider dans cette démarche. Une fois cela fait, nous pourrons suivre le guide de migration de la version 5.8 vers la version 6.0 lors de la mise à niveau vers Spring Boot 3.0.
c. Types de dispatch
Dans les applications Servlet, Spring Security 6.0 applique désormais l’autorisation à chaque type de dispatch. Pour aligner Spring Boot avec cela, le filtre de Spring Security est désormais configuré pour être appelé pour chaque type de dispatch. Nous pouvons configurer ces types en utilisant la propriété...
Conclusion
La migration vers Spring Framework 6 et Spring Boot 3, bien qu’elle puisse s’avérer être un processus long et nécessiter un effort considérable, est une étape essentielle pour les développeurs et les organisations souhaitant rester à la pointe de la technologie et maintenir la sécurité, la performance, et la compatibilité de leurs applications.
Spring Framework 6 et Spring Boot 3 exigent Java 17 ou plus récent, ce qui signifie que les applications peuvent tirer parti des dernières fonctionnalités du langage Java, de meilleures performances et de la sécurité améliorée.
Ces versions sont alignées sur Jakarta EE 10, marquant une étape importante vers l’adoption des espaces de noms jakarta.*, essentiels pour l’avenir du développement Java EE.
La migration encourage l’adoption de meilleures pratiques de développement et l’utilisation de nouvelles API et fonctionnalités, telles que les clients web réactifs, la configuration améliorée des propriétés, et un support plus robuste pour la programmation réactive.
Les améliorations dans la gestion des ressources et les optimisations de performance peuvent réduire l’empreinte mémoire et améliorer le temps de réponse des applications.
Spring Security...
Points clés
Points à retenir :
-
Il faut migrer sur Spring 6 et Spring boot 3.
-
Spring 6 demande le JDK 17 ou supérieur.
-
Toutes les API dépréciées des versions antérieures ont été retirées.
-
Le passage de Java EE à Jakarta EE 9 impose le passage de javax.* à jakarta.*.