自动装配的核心就是扫描约定目录下的文件进行解析,解析后把得到的configration配置类通过ImportSelector进行导入,从而完成Bean的自动装配。
首先,从代码讲起:
@SpringBootApplication //核心配置类,该类且是复合配置类
public class StartdemoApplication {
public static void main(String[] args) {
SpringApplication.run(StartdemoApplication.class, args);
}
}
此处,我们通过分析该类,该类是
//EnableAutoConfigurationImportSelector继承了AutoConfigurationImportSelector
public class EnableAutoConfigurationImportSelector
extends AutoConfigurationImportSelector {
}
//实现了selectImports()方法
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
if (!isEnabled(annotationMetadata)) {
return NO_IMPORTS;
}
try {
//该方法是扫描protected static final String PATH = "META-INF/spring-autoconfigure-metadata.properties"内容,加载自动装配的类如(图1)
AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader.loadMetadata(this.beanClassLoader);
//此方法是获取@EnableAutoConfiguration注解中的exclude,excludeName内容
AnnotationAttributes attributes = getAttributes(annotationMetadata);
//getCandidateConfigurations,此方法是最为核心点,扫描META-INF/spring.factories文件内容,加载自动配置类,其中会有conditonal条件装配
List<String> configurations = getCandidateConfigurations(annotationMetadata,attributes);
//去除重复项
configurations = removeDuplicates(configurations);
configurations = sort(configurations, autoConfigurationMetadata);
Set<String> exclusions = getExclusions(annotationMetadata, attributes);
checkExcludedClasses(configurations, exclusions);
configurations.removeAll(exclusions);
configurations = filter(configurations, autoConfigurationMetadata);
fireAutoConfigurationImportEvents(configurations, exclusions);
return configurations.toArray(new String[configurations.size()]);
}
catch (IOException ex) {
throw new IllegalStateException(ex);
}
}
附属其他博主所讲:
https://blog.csdn.net/u014745069/article/details/83820511