Springboot自动配置原理也算是面试中的热点题目,常用框架的原理还是必须掌握的。下面我们通过源码分析其原理。
首先,Springboot项目启动类引入注解@SpringBootApplication
:
@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)
Class<?>[] exclude() default {};
@AliasFor(annotation = EnableAutoConfiguration.class)
String[] excludeName() default {};
}
该注解会引用@EnableAutoConfiguration
,间接引入AutoConfigurationImportSelector
类。
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
Class<?>[] exclude() default {};
String[] excludeName() default {};
}
下面我们重点介绍AutoConfigurationImportSelector
类,该类实现了selectImports
方法,
@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;
}
// exclude和excludeName
AnnotationAttributes attributes = getAttributes(annotationMetadata);
// 加载 META-INF/spring.factories 下的自动配置类
List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
// 去重
configurations = removeDuplicates(configurations);
// 排除exclude类
Set<String> exclusions = getExclusions(annotationMetadata, attributes);
checkExcludedClasses(configurations, exclusions);
configurations.removeAll(exclusions);
// filter,默认OnClassCondition、OnWebApplicationCondition、OnBeanCondition条件注解
configurations = getConfigurationClassFilter().filter(configurations);
// 通知自动配置导入事件
fireAutoConfigurationImportEvents(configurations, exclusions);
// 封装返回配置类
return new AutoConfigurationEntry(configurations, exclusions);
}
configurations截图如下:
实现原理大致流程图如下:
文档信息
- 本文作者:yindongxu
- 本文链接:https://iceblow.github.io/2022/03/21/Springboot%E8%87%AA%E5%8A%A8%E9%85%8D%E7%BD%AE%E5%8E%9F%E7%90%86/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)