Como o SpringBoot realiza a montagem automática?

1 Como o SpringBoot é montado automaticamente e como iniciar o Tomcat integrado para execução.

1.1 Anotação e composição do SpringBootApplication

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

O código acima chama o método de execução estática de SpringApplication, executa uma instância SpringApplication com a configuração padrão e retorna um contexto Spring em execução. Dentre eles, a configuração padrão é carregada através da anotação @SpringBootApplication, o que significa que a montagem automática do SpringBoot é realizada através desta anotação.

@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 é uma anotação composta, usada para configurar rapidamente a classe de inicialização. Existem 7 anotações nas anotações, das quais as 4 primeiras são metanotações, que são usadas para modificar as anotações atuais e não têm função real. Existem três notas importantes.

  • @ComponentScan: Diga ao Spring para varrer automaticamente as classes que usam @Service, @Component, @Repository e @Controller no pacote e registrá-los como beans.

  • @SpringBootConfiguration: Identificado por @Configuration, declara que a classe atual é uma classe de configuração, que equivale ao arquivo xml de configuração do Spring.

  • @EnableAutoConfiguration: A função é habilitar a montagem automática, para que o Spring Boot defina automaticamente o projeto atual de acordo com as dependências do pacote jar no classpath. Por exemplo, se a dependência Spring-boot-starter-web for adicionada, as dependências Tomcat e SpringMVC serão adicionadas automaticamente e ambas serão configuradas automaticamente na inicialização.

SpringBoot verifica apenas os pacotes e subpacotes de mesmo nível da classe onde a anotação @SpringBootApplication está localizada.

1.2 @EnableAutoConfiguration montagem automática

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

@EnableAutoConfiguration importará a configuração padrão do seletor 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;
}

Por meio do rastreamento de código, podemos aprender que a anotação @EnableAutoConfiguration carrega principalmente as classes de configuração automática em ETA-INF / spring.factories. Em spring.factories, podemos encontrar classes relacionadas a Tomcat e 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

Acho que você gosta

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