自动装配是通过@EnableAutoConfiguration注解开启的,这个注解在启动类注解@SpringBootApplication内
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration
进入@EnableAutoConfiguration注解 看到有@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
其中@AutoConfigurationPackage作用是把该类所在的包及子包下的所有组件扫描到ioc容器中
AutoConfigurationImportSelector实现了ImportSelector,通过selectImports返回一个String数组,这个数组可以指定需要装配到IOC容器的类,与@Cofiguration不同的是AutoConfigurationImportSelector可以实现批量装载
DEMO:
定义对象
public class FirstClass {
private String rtn;
public String getRtn() {
return rtn;
}
public void setRtn(String rtn) {
this.rtn = rtn;
}
定义MySelector
public class MySelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
return new String[]{FirstClass.class.getName(),SenondClass.class.getName()};
}
定义AutoConfig模拟EnableAutoConfiguration
@AutoConfigurationPackage
@Retention(RetentionPolicy.RUNTIME)
@Import(MySelector.class)
public @interface MyAtuoConfig {
}
定义启动类并使用MyAtuoConfig 即可获取bean
@SpringBootApplication
@MyAtuoConfig
public class Application {
public static void main(String[] args) {
ConfigurableApplicationContext context= SpringApplication.run(Application.class,args);
FirstClass firstClass=context.getBean(FirstClass.class);
原理分析
AutoConfigurationImportSelector类
public String[] selectImports(AnnotationMetadata annotationMetadata) {
if (!this.isEnabled(annotationMetadata)) {
return NO_IMPORTS;
} else {
AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader.loadMetadata(this.beanClassLoader);
AutoConfigurationImportSelector.AutoConfigurationEntry autoConfigurationEntry = this.getAutoConfigurationEntry(autoConfigurationMetadata, annotationMetadata);
return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
}
}
核心过程
1.通过@Import(AutoConfigurationImportSelector)实现配置类的导入
2.AutoConfigurationImportSelector重写selectImorts用于选择性批量配置类的装配
3.通过spring提供的SpringFactoriesLoader机制,扫描classpath路径下的META-INF/spirng.factories,读取需要实现的及自动装配的配置类
4.通过条件筛选的方式,把不符合条件的配置类移除,最终完成自动装配