1、从@SpringBootApplication注解开始
该注解是一个合成注解,由以下几个注解组成
只需要关注@EnableAutoConfiguration注解,是自动装配原理的核心,再来看看它的组成。
而它的实现由AutoConfigurationImportSelector这个类实现,它的源代码
实现了红色框的接口,就会实现DeferredImportSelector类的父类ImportSelector中的selectImports()方法,该方法主要用于获取所有符合条件的类的全限定类名,这些类需要被加载到 IoC 容器中
在getAutoConfigurationEntry()方法中。
protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
//1 判断自动装备是否开启
if (!this.isEnabled(annotationMetadata)) {
return EMPTY_ENTRY;
} else {
//2 用于获取EnableAutoConfiguration注解中的 exclude 和 excludeName
AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
//3 获取需要自动装配的所有配置类,读取META-INF/spring.factories
List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
//4 按需加载组件
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 AutoConfigurationEntry(configurations, exclusions);
}
}