本文基于spring-boot:1.5.14.RELEASE
本人能力有限,很多地方可能说的不够详尽,不到之处还请斧正。写本文的目的主要是巩固自己的学习,也给spring boot初学者一些帮助。
@EnableAutoConfiguration中通过@Import引入EnableAutoConfigurationImportSelector,继承AutoConfigurationImportSelector。使用ImportSelector可以在Annotation上添加一些属性,然后根据属性的不同加载不同的bean。
下面是AutoConfigurationImportSelector的selectImports方法代码:
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
if (!isEnabled(annotationMetadata)) {
return NO_IMPORTS;
}
try {
AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader.loadMetadata(this.beanClassLoader);
AnnotationAttributes attributes = getAttributes(annotationMetadata);
List configurations = getCandidateConfigurations(annotationMetadata,attributes);
configurations = removeDuplicates(configurations); // 利用LinkedHashSet去除重复配置
configurations = sort(configurations, autoConfigurationMetadata);
Set exclusions = getExclusions(annotationMetadata, attributes);
checkExcludedClasses(configurations, exclusions);
configurations.removeAll(exclusions); // 去除所有exclude的配置
configurations = filter(configurations, autoConfigurationMetadata);
fireAutoConfigurationImportEvents(configurations, exclusions);
return configurations.toArray(new String[configurations.size()]);
}
catch (IOException ex) {
throw new IllegalStateException(ex);
}
}
- isEnabled方法通过spring.boot.enableautoconfiguration的值确定是否开启,默认开启。
- AutoConfigurationMetadataLoader.loadMetadata
加载spring-boot-autoconfig包下的spring-autoconfigure-metadata.properties配置文件,获取所有支持自动配置的信息-> Properties -> AutoConfigurationMetadata - getAttributes
获取EnableAutoConfiguration的属性,也就是exclue和excludeName的内容 - getCandidateConfigurations
SpringFactoriesLoader.loadFactoryNames,根据META-INF/spring.factories
从jar包中获取所有支持EnableAutoConfiguration的组件信息
- ...简单的方法见代码后面注释
- filter
这里filter方法中,AutoConfigurationImportFilter的match()方法,由OnClassCondition实现,即通过查找有没有导入某些jar包,通过新建一个布尔类型数组,来标记没有导入jar的AutoConfiguration,然后skip掉。
参考: http://fangjian0423.github.io/2016/11/13/springboot-enable-annotation/
网友评论