web-dev-qa-db-fra.com

Minimiser le temps de démarrage du démarrage de printemps

À mon avis, les projets SpringBoot prennent beaucoup de temps à charger. Cela se produit probablement parce que SpringBoot configure des composants pour vous, dont certains peuvent même ne pas être nécessaires. La chose la plus évidente à faire est de supprimer les dépendances inutiles de votre chemin de classe. Mais cela ne suffit pas.

Existe-t-il un moyen de savoir quels modules SpringBoot configure pour que vous puissiez sélectionner ce dont vous n'avez pas besoin et les désactiver?

Y a-t-il autre chose que l'on puisse faire pour accélérer le temps de démarrage des applications SpringBoot en général?

24
Samantha Catania

Je peux vous dire que j'exécute une grande application (plus de 800 000 lignes de code), en utilisant des services Web reposants via Spring MVC, JMS, transaction Atomikos, Hibernate, support JMX et Tomcat intégré. Avec tout cela, l'application démarrera sur mon bureau local dans environ 19 secondes.

Spring Boot s'efforce de ne pas configurer les modules que vous n'utilisez pas. Cependant, il est facile d'introduire des dépendances et une configuration supplémentaires que vous ne vouliez pas.

N'oubliez pas que Spring Boot suit la convention sur le paradigme de configuration et qu'en plaçant simplement une bibliothèque dans votre chemin de classe, Spring Boot peut tenter de configurer un module pour utiliser la bibliothèque. En outre, en faisant quelque chose d'aussi simple que d'annoter votre classe avec @RestController, Spring Boot déclenchera la configuration automatique de l'ensemble de la pile Spring MVC.

Vous pouvez voir ce qui se passe sous les couvertures et activer la journalisation du débogage aussi simple que de spécifier --debug lors du démarrage de l'application à partir de la ligne de commande. Vous pouvez également spécifier debug = true dans votre application.properties.

De plus, vous pouvez définir le niveau de journalisation dans application.properties aussi simple que:

logging.level.org.springframework.web: DEBUG
logging.level.org.hibernate: ERROR

Si vous détectez un module auto-configuré dont vous ne voulez pas, il peut être désactivé. Les documents pour cela peuvent être trouvés ici: http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#using-boot-disabling-specific-auto-configuration

Un exemple ressemblerait à:

@Configuration
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class MyConfiguration {
}
37
pczeus

Quelques conseils supplémentaires qui peuvent être utiles.

En plus:

Comme cet article recommande d'utiliser @ComponentScan(lazyInit = true) pour l'environnement de développement local.

TL; DR

Ce que nous voulons réaliser, c'est activer le chargement paresseux du bean uniquement dans votre environnement de développement local et laisser l'initialisation désirée pour la production. Ils disent que vous ne pouvez pas avoir votre gâteau et le manger aussi, mais avec le printemps, vous pouvez vraiment. Tout cela grâce aux profils.

@SpringBootApplication
public class LazyApplication {

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

    @Configuration
    @Profile("local")
    @ComponentScan(lazyInit = true)
    static class LocalConfig {
    }

}
7
Mikhail Kholodkov