SpringBoot는 어떻게 자동 조립을 실현합니까?

1 SpringBoot가 자동으로 어셈블되는 방법과 내장 Tomcat을 시작하여 실행하는 방법.

1.1 SpringBootApplication 주석 및 구성

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

위의 코드는 SpringApplication의 정적 실행 메소드를 호출하고 기본 구성으로 SpringApplication 인스턴스를 실행하고 실행중인 Spring 컨텍스트를 리턴합니다. 그중 기본 설정은 @SpringBootApplication 어노테이션을 통해로드되며 이는이 어노테이션을 통해 SpringBoot의 자동 어셈블리가 완료됨을 의미합니다.

@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은 시작 클래스를 빠르게 구성하는 데 사용되는 복합 주석입니다. 주석에는 7 개의 주석이 있으며, 그 중 처음 4 개는 메타 주석으로 현재 주석을 수정하는 데 사용되며 실제 기능은 없습니다. 세 가지 중요한 메모가 있습니다.

  • @ComponentScan : Spring에 패키지에서 @Service, @Component, @Repository 및 @Controller를 사용하는 클래스를 자동으로 스캔하여 Bean으로 등록하도록 지시합니다.

  • @SpringBootConfiguration : @Configuration에 의해 식별되며 현재 클래스가 Spring 구성의 xml 파일과 동일한 구성 클래스임을 선언합니다.

  • @EnableAutoConfiguration :이 기능은 자동 어셈블리를 활성화하여 Spring Boot가 클래스 경로의 jar 패키지 종속성에 따라 현재 프로젝트를 자동으로 설정하도록하는 것입니다. 예를 들어 Spring-boot-starter-web 종속성이 추가되면 Tomcat 및 SpringMVC 종속성이 자동으로 추가되고 둘 다 시작시 자동으로 구성됩니다.

SpringBoot는 @SpringBootApplication 주석이있는 클래스의 동일한 레벨 패키지 및 하위 패키지 만 스캔합니다.

1.2 @EnableAutoConfiguration 자동 어셈블리

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

@EnableAutoConfiguration은 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;
}

코드 추적을 통해 @EnableAutoConfiguration 어노테이션이 주로 ETA-INF / spring.factories에 자동 구성 클래스를로드한다는 것을 알 수 있으며 spring.factories에서는 Tomcat 및 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

추천

출처blog.csdn.net/LIZHONGPING00/article/details/112689978