Migration de Spring à Spring Boot

Migration de Spring à Spring Boot

1. Vue d'ensemble

Dans cet article, nous allons examiner comment nous pouvons migrer une application Spring Framework existante vers une applicationSpring Boot.

Spring Boot is not intended to replace Spring, but to make working with it faster and easier. Par conséquent, la plupart des changements nécessaires à la migration d'une application sont liés à la configuration. Pour la plupart, nos contrôleurs personnalisés et autres composants resteront les mêmes.

Développer avecSpring Boot apporte plusieurs avantages:

  • gestion des dépendances plus simple

  • configuration automatique par défaut

  • serveur web intégré

  • métriques d'application et contrôles de santé

  • configuration externalisée avancée

2. DémarreursSpring Boot

Tout d'abord, nous aurons besoin d'un nouvel ensemble de dépendances. Spring Boot provides convenient starter dependencies, which are dependency descriptors qui peuvent apporter toute la technologie nécessaire pour certaines fonctionnalités.

Celles-ci présentent l'avantage que vous n'avez plus besoin de spécifier de version pour chaque dépendance, mais de laisser le démarreur gérer les dépendances à votre place.

Le moyen le plus rapide de commencer est d'ajouter lesspring-boot-starter-parentpom.xml:


    org.springframework.boot
    spring-boot-starter-parent
    1.5.6.RELEASE

Cela prendra en charge la gestion de la dépendance.

Nous passerons en revue d'autres éléments de démarrage dans les sections suivantes, en fonction de la fonctionnalité que nous allons migrer. Pour référence, vous pouvez trouver la liste complète des démarreurshere.

De manière plus générale, nous voudrons supprimer toute version de dépendance explicitement définie qui est également gérée parSpring Boot. Sinon, nous pouvons rencontrer des incompatibilités entre nos versions définies et celles utilisées par Boot.

3. Point d'entrée de l'application

Chaque application créée à l'aide deSpring Boot doit définir le point d'entrée principal. Il s'agit généralement d'une classe Java avec la méthodemain, annotée avec@SpringBootApplication:

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

L'annotation@SpringBootApplication ajoute les annotations suivantes:

  • @Configuration - qui marque la classe comme source de définitions de bean

  • @EnableAutoConfiguration - qui indique au framework d'ajouter automatiquement des beans en fonction des dépendances sur le chemin de classe

  • @ComponentScan - qui recherche d'autres configurations et beans dans le même package que la classeApplication ou inférieure

By default, the @SpringBootApplication annotation scans all classes in the same package or below. Par conséquent, une structure de package pratique pourrait ressembler à ceci:

image

Si votre application est une application non Web qui crée unApplicationContext, ce code peut être supprimé et remplacé par la classe@SpringBootApplication ci-dessus.

Un problème que nous pouvons rencontrer a plusieurs classes de configuration en conflit. Pour éviter cela, nous avons la possibilité de filtrer les classes analysées:

@SpringBootAppliaction
@ComponentScan(excludeFilters = {
  @ComponentScan.Filter(type = FilterType.REGEX,
  pattern = "com.example.config.*")})
public class Application {
    //...
}

4. Importer la configuration et les composants

Spring Boot repose fortement sur les annotations pour la configuration, mais vous pouvez toujours importer votre configuration existante au format d'annotation et XML.

Pour récupérer vos@Configuration ou classes de composants existants, vous avez deux options:

  • déplacer les classes existantes vers un package identique ou inférieur au package de classe principalApplication

  • importer les classes explicitement

To import the classes explicitly, you can use the @ComponentScan or @Import annotations sur la classe principale:

@SpringBootApplication
@ComponentScan(basePackages="com.example.config")
@Import(UserRepository.class)
public class Application {
    //...
}

La documentation officielle recommande d'utiliser des annotations sur une configuration XML. Cependant, si vous avez déjà des fichiers XML que vous ne souhaitez pas convertir en configuration Java, vous pouvez toujours les importer en utilisant@ImportResource:

@SpringBootApplication
@ImportResource("applicationContext.xml")
public class Application {
    //...
}

5. Migrer les ressources d'application

Par défaut,Spring Boot recherche les fichiers de ressources dans l'un des emplacements suivants:

  • /Ressources

  • /Publique

  • /statique

  • /META-INF/resources

Pour migrer, nous pouvons déplacer tous nos fichiers de ressources vers l'un de ces emplacements, ou nous pouvons personnaliser les emplacements des ressources en définissant la propriétéspring.resources.static-locations:

spring.resources.static-locations=classpath:/images/,classpath:/jsp/

6. Migrer les propriétés de l'application

Le framework chargera automatiquement toutes les propriétés définies dans les fichiers appelésapplication.properties ouapplication.yml placés à l'un de ces emplacements:

  • un sous-répertoire/config du répertoire courant

  • le répertoire courant

  • un répertoire/config sur le chemin de classe

  • la racine du classpath

Pour éviter de charger explicitement les propriétés, nous pouvons les déplacer vers un fichier portant ce nom à l’un de ces emplacements. Par exemple, dans le dossier/resources qui doit être présent sur le chemin de classe.

Nous pouvons également charger automatiquement des propriétés spécifiques au profil à partir de fichiers appelésapplication-{profile}.properties.

De plus, un grand nombre depredefined property names sont disponibles pour configurer différents comportements d'application.

Chaque module de framework Spring que vous utilisez dans votre application nécessitera de légères modifications, principalement liées à la configuration. Jetons un coup d'œil à certaines des fonctionnalités les plus couramment utilisées.

7. Migrer une application Web Spring

7.1. Web Starter

Spring Boot fournit un démarreur pour les applications Web qui apporteront toutes les dépendances nécessaires. Cela signifie que nous pouvons supprimer toutes les dépendances spécifiques au Web du framework Spring et les remplacer parspring-boot-starter-web:


    org.springframework.boot
    spring-boot-starter-web

PuisqueSpring Boot tente de configurer automatiquement une application chaque fois que possible en fonction du chemin de classe, l'ajout de cette dépendance entraînera l'ajout de l'annotation@EnableWebMvc à la classe principaleApplication, ainsi que la configuration un haricotDispatcherServlet.

Si vous aviez une classeWebApplicationInitializer qui configure unDispatcherServlet, ce n'est plus nécessaire, pas plus que l'annotation@EnableWebMvc.

Nous pouvons, bien sûr, définir nos haricots si nous voulons un comportement personnalisé, et dans ce cas, nos haricots seront utilisés.

Si nous utilisons explicitement l'annotation@EnableWebMvc sur une classe@Configuration, alors la configuration automatique MVC ne sera plus activée.

L'ajout du démarreur Web détermine également la configuration automatique des beans suivants:

  • prise en charge de la diffusion de contenu statique à partir d'un répertoire appelé/static,/public,/resources ou/META-INF/resources sur le chemin de classe

  • BeansHttpMessageConverter pour les cas d'utilisation courants tels que JSON et XML

  • un mappage/error qui gère toutes les erreurs

7.2. Voir les technologies

En ce qui concerne la création de pages Web, la documentation officielle recommande de ne pas utiliser de fichiers JSP ni d'utiliser un moteur de modèle. La configuration automatique est incluse pour les moteurs de modèle suivants:Thymeleaf,Groovy,FreeMarker,Mustache. Tout ce que nous devons faire pour utiliser l’un d’eux est d’ajouter le démarreur spécifique:


    org.springframework.boot
    spring-boot-starter-thymeleaf

Les fichiers modèles doivent être placés dans le dossier/resources/templates.

Si nous voulons continuer à utiliser les fichiers JSP, nous devons configurer l'application de manière à ce qu'elle puisse résoudre les fichiers JSP. Par exemple, si nos fichiers sont en/webapp/WEB-INF/views, nous devons définir les propriétés suivantes:

spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

7.3. Serveur Web intégré

De plus, nous pouvons également exécuter notre application en utilisant un serveur Tomcat intégré, qui sera auto-configuré sur le port 8080 en ajoutant la dépendancespring-boot-starter-tomcat:


    org.springframework.boot
    spring-boot-starter-tomcat

Les autres serveurs Web pour lesquelsSpring Boot fournit une configuration automatique sontJetty etUndertow.

8. Migrer une application de sécurité Spring

Le démarreur pour activer Spring Security estspring-boot-starter-security:


    org.springframework.boot
    spring-boot-starter-security

Par défaut, cela créera un utilisateur appelé «utilisateur» avec un mot de passe généré aléatoirement enregistré au démarrage et sécurisera tous les points de terminaison avec une authentification de base. Cependant, nous souhaitons généralement ajouter notre configuration de sécurité, différente de celle par défaut.

Pour cette raison, nous garderons notre classe existante annotée avec@EnableWebSecurity qui étendWebSecurityConfigurerAdapter et définit une configuration personnalisée:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    // ...
}

9. Migrer une application Spring Data

En fonction de l'implémentation deSpring Data que nous utilisons, nous devrons ajouter le démarreur correspondant. Par exemple, pour JPA, nous pouvons ajouter la dépendancespring-boot-starter-data-jpa:


    org.springframework.boot
    spring-boot-starter-data-jpa

Si nous voulons utiliser une base de données en mémoire, l'ajout de la configuration automatique de dépendance correspondante activée pour les bases de données de typeH2,Derby etHSQLDB.

Par exemple, pour travailler avec une base de données en mémoireH2, tout ce dont nous avons besoin est la dépendanceh2:


    com.h2database
    h2

Si nous voulons travailler avec un type et une configuration de base de données différents, comme une base de donnéesMySQL, nous avons besoin de la dépendance ainsi que de définir une configuration.

Pour cela, nous pouvons soit conserver notre définition de beanDataSource, soit utiliser des propriétés prédéfinies:

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/myDb?createDatabaseIfNotExist=true
spring.datasource.username=user
spring.datasource.password=pass

Spring Boot configurera automatiquementHibernate comme fournisseur JPA par défaut, ainsi qu'un beantransactionManager.

10. Conclusion

Dans cet article, nous avons montré quelques scénarios courants rencontrés lors de la migration d'une application Spring existante vers le nouveau frameworkSpring Boot.

Dans l’ensemble, votre expérience de la migration dépendra bien entendu de l’application que vous avez construite.