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注解限定的条件,才会进行自动加载。
标签:
SpringBoot
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)