SpringBoot 부팅 메커니즘(starter 메커니즘) 핵심 원리 상세 설명

전언


springboot는 기본적으로 많은 프레임워크를 설정한 사용 방식을 통해 프로젝트의 초기 구축과 개발 과정을 크게 간소화시켰다.그렇다면 스프링북은 어떻게yml 파일을 통해 스프링 가족 전체를 시작했는지, 어떻게 자동 조립을 실현했는지 스프링북이 어떻게 이루어졌는지 살펴보자.
두 가지 지식을 보충하다
  • bean 대상을 주입하고 @Import 주석을 사용하면 대상의selectImports를 호출하여 하나의 그룹을 되돌려주고 그룹을 모두 주입하는 방법(자료 주소:https://blog.csdn.net/yaomingyang/article/details/98643980)
  • yml의 속성 읽기:bean 대상을 정의합니다(참고자료:https://blog.csdn.net/abreaking2012/article/details/83989338)

  • SpringBootApplication 메모를 통해 bean 로드


    springboot는 기본적으로 시작 클래스가 있는 패키지 아래의 주 클래스와 하위 클래스의 모든 구성 요소를 스캔하지만, 패키지에 의존하는 클래스를 포함하지 않습니다. 패키지에 의존하는 bean은 어떻게 발견되고 불러옵니까?우리는 보통 시작 클래스에 @SpringBootApplication이라는 주석을 넣고 눌러 봅니다
    
    @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 {
        @AliasFor(
            annotation = EnableAutoConfiguration.class,
            attribute = "exclude"
        )
        Class<?>[] exclude() default {};
    
        @AliasFor(
            annotation = EnableAutoConfiguration.class,
            attribute = "excludeName"
        )
        String[] excludeName() default {};
    
        @AliasFor(
            annotation = ComponentScan.class,
            attribute = "basePackages"
        )
        String[] scanBasePackages() default {};
    
        @AliasFor(
            annotation = ComponentScan.class,
            attribute = "basePackageClasses"
        )
        Class<?>[] scanBasePackageClasses() default {};
    }
    

    SpringBootApplication
    실제로 중요한 것은 세 가지 Annotation뿐입니다.
    @Configuration(@SpringBootConfiguration에서 @Configuration이 적용되었음) @EnableAutoConfiguration@ComponentScan
    @Configuration의 역할은 주석된 클래스가 bean 설정 클래스가 되는 것을 알고 있습니다.Br/>@ComponentScan의 역할은 조건에 맞는 구성 요소를 자동으로 스캔하고 불러오는 것입니다. 예를 들어 @Component와 @Repository 등입니다. 최종적으로 이 bean 정의를spring 용기에 불러옵니다. @Enable AutoConfiguration 이 주석의 기능은 @Import의 지원을 빌려 의존 패키지와 관련된 bean 정의를 수집하고 등록하는 데 매우 중요합니다.
    다음은 @EnableAutoConfiguration 메모에 초점을 맞춰 보겠습니다.
    import java.lang.annotation.Documented;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Inherited;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    import org.springframework.context.annotation.Import;
    
    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    @AutoConfigurationPackage
    @Import({EnableAutoConfigurationImportSelector.class})
    public @interface EnableAutoConfiguration {
        String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
    
        Class<?>[] exclude() default {};
    
        String[] excludeName() default {};
    }

    @EnableAutoConfiguration 메모
    주로 AutoConfiguration Package와 Import 두 개의 주석은 위 원본과 같습니다. @Enable AutoConfiguration 주석은 @AutoConfiguration Package와 @Import 두 개의 주석을 도입했습니다. @AutoConfigurationPackage의 역할은 자동으로 설정된 패키지입니다 @Import는 자동으로 설정해야 하는 구성 요소를 가져옵니다
    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    @Import(AutoConfigurationPackages.Registrar.class)
    public @interface AutoConfigurationPackage {
    
    }
    
    
    /**
     * {@link ImportBeanDefinitionRegistrar} to store the base package from the importing
     * configuration.
     */
    static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
    
        @Override
        public void registerBeanDefinitions(AnnotationMetadata metadata,
                BeanDefinitionRegistry registry) {
            register(registry, new PackageImport(metadata).getPackageName());
        }
    
        @Override
        public Set<Object> determineImports(AnnotationMetadata metadata) {
            return Collections.singleton(new PackageImport(metadata));
        }
    
    }

    new AutoConfigurationPackages.PackageImport(metadata)).getPackageName() new AutoConfigurationPackages.PackageImport(metadata) 이 두 코드의 역할은 시작 클래스가 있는 패키지 아래의 주 클래스와 하위 클래스의 모든 구성 요소를 불러와서spring 용기에 등록하는 것이다. 이것은 앞에서 말한 springboot 기본 스캔 시작 클래스가 있는 패키지 아래의 주 클래스와 하위 클래스의 모든 구성 요소이다.그 문제가 또 왔다. 스프링 용기에 수집하고 등록해야 하는 빈스는 어디에서 왔을까?AutoConfigurationImportSelector 클래스에 들어가면SpringFactories Loader를 발견할 수 있습니다.loadFactory Names 방법은 loadSpringFactories 방법을 호출하여 모든jar 패키지에서 META-INF/spring을 읽습니다.factories 파일 정보.다음은spring-boot-autoconfigure 이jar에서spring입니다.factories 파일의 일부 내용입니다. 키 중 하나가 org입니다.springframework.boot.autoconfigure.Enable AutoConfiguration의 값은 자동으로 설정해야 하는 bean을 정의합니다. 이 설정을 읽으면 @Configuration 클래스를 가져옵니다.
    # Auto Configuration Import Filters
    org.springframework.boot.autoconfigure.AutoConfigurationImportFilter=\
    org.springframework.boot.autoconfigure.condition.OnClassCondition
    
    # Auto Configure
    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
    org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
    org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
    org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
    org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
    org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
    org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\
    org.springframework.boot.autoconfigure.cloud.CloudAutoConfiguration,\
    org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\
    org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration,\
    org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration,\

    모든 xxxAutoConfiguration은 자바 기반 bean 설정 클래스입니다.실제로 이러한 xxxAutoConfiguratio는 모든 것이 불러오는 것이 아니며 xxAutoConfiguration의 @ConditionalOnclass 등 조건에 따라 불러오는 여부를 판단한다.반사 메커니즘을 통해spring을factories에서 @Configuration 클래스를 대응하는 자바 실열로 실례화합니다.이로써 자동으로 설정할 bean을 발견하는 방법을 알았습니다. 마지막 단계는spring 용기에 이 bean을 불러오는 것입니다.5.Bean 불러오기 일반 클래스를 Spring 용기 관리에 맡기려면 @Configuration과 @Bean 주석을 사용하여 @Controller@Service@Repository@Component 주석을 표시하고 @ComponentScan 자동 스캔을 사용합니다 @Import 방법springboot에서 @Import 방법br/>@EnableAutoConfiguration 주석에 @Import({AutoConfigurationImportor.class} 주석을 사용합니다AutoConfiguration Import Selector는 Deferred Import Selector 인터페이스를 실현했고 Deferred Import Selector 인터페이스는 Import Selector 인터페이스를 계승했다. Import Selector 인터페이스는 selectImports 방법이 하나밖에 없다.selectImports 방법은 한 그룹의 bean을 되돌려줍니다. @Enable AutoConfiguration 주석은 @Import 주석을 빌려 이 그룹의 bean을 스프링 용기에 주입합니다. 스프링북은 정식으로 이런 메커니즘을 통해 bean의 주입을 완성합니다.

    총결산


    springboot는 @Import ({Enable AutoConfiguration Import Selector.class}) 를 통해spring에 있는 위치를 가져옵니다.factories 파일 아래에 설정된 자동 가져오기 패키지의 아래에 설정된 불러올 bean 대상입니다.그리고 bean 대상이 불러올 때 yml 파일에 있는 대상을 new로 만들고 속성을 자동으로 가져옵니다.이렇게 하면yml 파일 전체의 대상을 하나하나 생성할 수 있다.

    좋은 웹페이지 즐겨찾기