Initialisation paresseuse dans Spring Boot 2

1. Vue d'ensemble

Dans ce tutoriel, nous verrons comment configurer l'initialisation différée au niveau de l'application, à partir de Spring Boot 2.2

2. Initialisation paresseuse

Par défaut dans Spring, tous les beans définis et leurs dépendances sont créés lors de la création du contexte d'application.

En revanche, lorsque nous configurons un bean avec une initialisation tardive, le bean ne sera créé et ses dépendances injectées qu'une fois nécessaires.

3. La dépendance Maven

Afin d'obtenir Spring Boot 2.2 dans notre application, nous devons l'inclure dans notre chemin de classe.

Avec Maven, nous pouvons simplement ajouter la dépendance spring-boot-starter :

  org.springframework.boot spring-boot-starter 2.2.2.RELEASE   

4. Activer l'initialisation différée

Spring Boot 2.2 introduit la propriété spring.main.lazy-initialization , ce qui facilite la configuration de l'initialisation différée dans toute l'application.

La définition de la valeur de la propriété sur true signifie que tous les beans de l'application utiliseront une initialisation différée.

Configurons la propriété dans notre fichier de configuration application.yml :

spring: main: lazy-initialization: true

Ou, si c'est le cas, dans notre fichier application.properties :

spring.main.lazy-initialization=true

Cette configuration affecte tous les beans du contexte. Donc, si nous voulons configurer une initialisation paresseuse pour un bean spécifique, nous pouvons le faire via l' approche @Lazy .

De plus, nous pouvons utiliser la nouvelle propriété, en combinaison avec l' annotation @Lazy , définie sur false .

Ou en d'autres termes, tous les beans définis utiliseront une initialisation paresseuse, à l'exception de ceux que nous configurons explicitement avec @Lazy (false) .

5. Exécuter

Créons un service simple qui nous permettra de tester ce que nous venons de décrire.

En ajoutant un message au constructeur, nous saurons exactement quand le bean sera créé.

public class Writer { private final String writerId; public Writer(String writerId) { this.writerId = writerId; System.out.println(writerId + " initialized!!!"); } public void write(String message) { System.out.println(writerId + ": " + message); } }

Créons aussi SpringApplication et injectent le service que nous avons créé auparavant.

@SpringBootApplication public class Application { @Bean("writer1") public Writer getWriter1() { return new Writer("Writer 1"); } @Bean("writer2") public Writer getWriter2() { return new Writer("Writer 2"); } public static void main(String[] args) { ApplicationContext ctx = SpringApplication.run(Application.class, args); System.out.println("Application context initialized!!!"); Writer writer1 = ctx.getBean("writer1", Writer.class); writer1.write("First message"); Writer writer2 = ctx.getBean("writer2", Writer.class); writer2.write("Second message"); } }

Définissons la valeur de la propriété spring.main.lazy-initialization sur false et exécutons notre application.

Writer 1 initialized!!! Writer 2 initialized!!! Application context initialized!!! Writer 1: First message Writer 2: Second message

Comme nous pouvons le voir, les beans ont été créés lors du démarrage du contexte d'application.

Modifions maintenant la valeur de spring.main.lazy-initialization sur true et réexécutons notre application.

Application context initialized!!! Writer 1 initialized!!! Writer 1: First message Writer 2 initialized!!! Writer 2: Second message

En conséquence, l'application n'a pas créé les beans au démarrage, mais uniquement lorsqu'elle en avait besoin.

6. Effets de l'initialisation paresseuse

L'activation de l'initialisation paresseuse dans l'ensemble de l'application peut produire des effets à la fois positifs et négatifs.

Parlons de certains d'entre eux, tels qu'ils sont décrits dans l'annonce officielle de la nouvelle fonctionnalité:

  1. L'initialisation paresseuse peut réduire le nombre de beans créés au démarrage de l'application - par conséquent, nous pouvons améliorer le temps de démarrage de l'application
  2. Comme aucun des beans n'est créé tant qu'ils ne sont pas nécessaires, nous pourrions masquer les problèmes, en les mettant à l'exécution au lieu du démarrage
  3. Les problèmes peuvent inclure des erreurs de mémoire insuffisante, des erreurs de configuration ou des erreurs de définition de classe trouvées
  4. De plus, lorsque nous sommes dans un contexte Web, déclencher la création de bean à la demande augmentera la latence des requêtes HTTP - la création de bean n'affectera que la première requête, mais cela peut avoir un impact négatif sur l'équilibrage de charge et la mise à l'échelle automatique .

7. Conclusion

Dans ce didacticiel, nous avons configuré l'initialisation différée avec la nouvelle propriété spring.main.lazy-initialization, introduite dans Spring Boot 2.2.

Comme toujours, le code source de ce didacticiel est disponible à l'adresse over sur GitHub.