¿Cómo SpringBoot realiza el ensamblaje automático?

1 ¿Cómo se ensambla SpringBoot automáticamente y cómo iniciar el Tomcat integrado para que se ejecute?

1.1 SpringBootApplication anotación y composición

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

El código anterior llama al método de ejecución estática de SpringApplication, ejecuta una instancia de SpringApplication con la configuración predeterminada y devuelve un contexto de Spring en ejecución. Entre ellos, la configuración predeterminada se carga a través de la anotación @SpringBootApplication, lo que significa que el ensamblaje automático de SpringBoot se completa a través de esta anotación.

@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 es una anotación compuesta, que se utiliza para configurar rápidamente la clase de inicio. Hay 7 anotaciones en las anotaciones, de las cuales las primeras 4 son meta anotaciones, que se utilizan para modificar las anotaciones actuales y no tienen una función real. Hay tres notas importantes.

  • @ComponentScan: Dígale a Spring que escanee automáticamente las clases que usan @Service, @Component, @Repository y @Controller en el paquete, y que las registre como beans.

  • @SpringBootConfiguration: identificado por @Configuration, declara que la clase actual es una clase de configuración, que es equivalente al archivo xml de la configuración de Spring.

  • @EnableAutoConfiguration: la función es habilitar el ensamblaje automático, de modo que Spring Boot configurará automáticamente el proyecto actual de acuerdo con las dependencias del paquete jar en la ruta de clase. Por ejemplo, si se agrega la dependencia Spring-boot-starter-web, las dependencias de Tomcat y SpringMVC se agregarán automáticamente, y ambas se configurarán automáticamente al inicio.

SpringBoot solo escanea los paquetes y subpaquetes del mismo nivel de la clase donde se encuentra la anotación @SpringBootApplication.

1.2 @EnableAutoConfiguration montaje automático

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

@EnableAutoConfiguration importará la configuración predeterminada del selector 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;
}

A través del seguimiento de código, podemos aprender que la anotación @EnableAutoConfiguration carga principalmente las clases de configuración automática en ETA-INF / spring.factories. En spring.factories, podemos encontrar clases relacionadas con Tomcat y 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

Supongo que te gusta

Origin blog.csdn.net/LIZHONGPING00/article/details/112689978
Recomendado
Clasificación