Springboot的@EnableAutoConfiguration注解

@EnableAutoConfiguration注解

第一层:

@EnableAutoConfiguration

第二层:

@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})

第三层:

public String[] selectImports(AnnotationMetadata annotationMetadata) {
    if (!this.isEnabled(annotationMetadata)) {
        return NO_IMPORTS;
    } else {
        //====================getAutoConfigurationEntry 该方法返回了一个String类型的数组================
        AutoConfigurationImportSelector.AutoConfigurationEntry autoConfigurationEntry = this.getAutoConfigurationEntry(annotationMetadata);
       
        return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
    }
}

 第四层:

protected AutoConfigurationImportSelector.AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
    if (!this.isEnabled(annotationMetadata)) {
        return EMPTY_ENTRY;
    } else {
        AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
        
        //===============getCandidateConfigurations 方法返回的是一个String类型的集合=================
        List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
        
        configurations = this.removeDuplicates(configurations);
        Set<String> exclusions = this.getExclusions(annotationMetadata, attributes);
        this.checkExcludedClasses(configurations, exclusions);
        configurations.removeAll(exclusions);
        configurations = this.getConfigurationClassFilter().filter(configurations);
        this.fireAutoConfigurationImportEvents(configurations, exclusions);
        return new AutoConfigurationImportSelector.AutoConfigurationEntry(configurations, exclusions);
    }
}

 第五层:

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
    
    //===================通过SpringFactoriesLoader加载,返回List集合,这个集合中就是Springboot启动时需要自动加载的类==================
    List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
    
    //====================在哪里加载的呢,就是META-INF目录下的这个spring.factories文件
    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是一个组合注解,该注解内部使用@Import注解引入配置类AutoConfigurationImportSelector.Class 该类是ImportSelect接口的实现类,该实现类重写其该接口中的selectImports()方法,得到一个String类型的数组。该数组是通过底层加载配置文件 META-INF/spring.factories得到的,该配置文件中定义了大量的配置类,Sringboot 启动的时候会加载所有的selector并执行selectImports方法,从而完成自动配置。但不是所有的类在初始化时都可以自动加载进SpringIOC容器,要结合@Conditional这个条件注解判断,待加载的配置类如果满足了所有的@Conditional注解限定的条件,才会进行自动加载。

posted @ 2022-03-27 22:27  许君闲乘悦  阅读(161)  评论(0编辑  收藏  举报