1.自动装配是什么?
自动装配就是把别人写好的config配置类加载到spring容器,然后根据这个配置类生成一些项目需要的bean对象。
2.自动装配的开关在哪?
在@SpringBootApplication注解里的@EnableAutoConfiguration用@Import注解导入了@AutiConfigurationImportSelector.class类,这个类的selectImports方法会扫描到我们类路径下的spring.factories文件(里面装的是有很多官方写好的自动装配类的全限定名),然后返回这些类的名字。
slectImports方法如下:
public String[] selectImports(AnnotationMetadata annotationMetadata) {
if (!this.isEnabled(annotationMetadata)) {
return NO_IMPORTS;
} else {
AutoConfigurationImportSelector.AutoConfigurationEntry autoConfigurationEntry = this.getAutoConfigurationEntry(annotationMetadata);
return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
}
}
3.结束语
其实springboot的自动装配还是比较复杂的,大概可以概括为:在启动类的run方法传入启动类的class(方便后面获取其注解信息)。
执行run方法,创建SpringApplication对象,并用LoadSpringFactories()方法将/META-INF/spring.factories文件里的k-v读入缓存(方便后面加载时使用)。
然后继续run方法,在某处会获取传入的启动类的class,并解析上面的注解,当解析到@Import({AutoConfigurationImportSelector.class})时会将AutoConfigurationImportSelector加载进方法区,通过反射创建对象,调用其某一个方法,从缓存读取前面存储的k-v,并经过一系列的过滤、去重等,最后将需要的配置类加载,生成BD对象,创建Bean对象,放入spring容器。