Comment SpringBoot réalise-t-il l'assemblage automatique?

1 Comment SpringBoot s'assemble automatiquement et comment démarrer le Tomcat intégré pour qu'il s'exécute.

1.1 Annotation et composition de SpringBootApplication

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

Le code ci-dessus appelle la méthode d'exécution statique de SpringApplication, exécute une instance de SpringApplication avec la configuration par défaut et renvoie un contexte Spring en cours d'exécution. Parmi eux, la configuration par défaut est chargée via l'annotation @SpringBootApplication, ce qui signifie que l'assemblage automatique de SpringBoot est terminé via cette annotation.

@Target({
    
    ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {
    
    @Filter(
    type = FilterType.CUSTOM,
    classes = {
    
    TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {
    
    AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
    
    

@SpringBootApplication est une annotation composite, utilisée pour configurer rapidement la classe de démarrage. Il y a 7 annotations sur les annotations, dont les 4 premières sont des méta annotations, qui sont utilisées pour modifier les annotations actuelles et n'ont aucune fonction réelle. Il y a trois remarques importantes.

  • @ComponentScan: dites à Spring d'analyser automatiquement les classes qui utilisent @Service, @Component, @Repository et @Controller dans le package, et de les enregistrer en tant que beans.

  • @SpringBootConfiguration: Identifié par @Configuration, déclare que la classe actuelle est une classe de configuration, ce qui équivaut au fichier xml de la configuration Spring.

  • @EnableAutoConfiguration: La fonction est d'activer l'assemblage automatique, de sorte que Spring Boot définisse automatiquement le projet actuel en fonction des dépendances du package jar dans le chemin de classe. Par exemple, si la dépendance Spring-boot-starter-web est ajoutée, les dépendances Tomcat et SpringMVC seront automatiquement ajoutées et les deux seront automatiquement configurées au démarrage.

SpringBoot analyse uniquement les packages et sous-packages de même niveau de la classe où se trouve l'annotation @SpringBootApplication.

1.2 Assemblage automatique @EnableAutoConfiguration

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration

@EnableAutoConfiguration importera la configuration par défaut du sélecteur AutoConfigurationImportSelector

// AutoConfigurationImportSelector
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
    
    
   if (!isEnabled(annotationMetadata)) {
    
    
      return NO_IMPORTS;
   }
   // 核心加载语句
   AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(annotationMetadata);
   return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
}

protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
    
    
    if (!isEnabled(annotationMetadata)) {
    
    
        return EMPTY_ENTRY;
    }
    AnnotationAttributes attributes = getAttributes(annotationMetadata);
    List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
    ....
}

// 返回自动配置的类名
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
    
    
    List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),
                                                                         getBeanClassLoader());
    Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you "
                    + "are using a custom packaging, make sure that file is correct.");
    return configurations;
}

Grâce au traçage de code, nous pouvons apprendre que l'annotation @EnableAutoConfiguration charge principalement les classes de configuration automatique dans ETA-INF / spring.factories. Dans spring.factories, nous pouvons trouver des classes liées à Tomcat et SpringMVC.

// 内置servlet/Reactive服务器的相关配置
// 如果使用到Tomcat,则会加载内联Tomcat配置(Jetty/Netty同理)
org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration
// 内部会加载Tomcat
org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration

Je suppose que tu aimes

Origine blog.csdn.net/LIZHONGPING00/article/details/112689978
conseillé
Classement