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 configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
        
        configurations = this.removeDuplicates(configurations);
        Set 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 getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
    
    //===================通过SpringFactoriesLoader加载,返回List集合,这个集合中就是Springboot启动时需要自动加载的类==================
    List 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导入容器中,springboot启动的时候会加载所有的selector并执行selectImports方法,这个方法会加载META-INF/spring.factories中配置的EnableAutoConfiguration,从而加载自动配置