一、作用
开启自动配置
@EnableAutoConfiguration注解的定义中使用了@Import注解,导入AutoConfigurationImportSelector.class,作用等同于在Spring的xml文件中使用导入
二、自动配置过程
1、找到文件:META-INF/spring.factories
D:\repository\org\springframework\boot\spring-boot-autoconfigure\2.6.7\spring-boot-autoconfigure-2.6.7.jar!\META-INF\spring.factories
2)加载内容:org.springframework.boot.autoconfigure.EnableAutoConfiguration
值是一个列表,需要进行自动化配置的类的列表
3)去重、排他、过滤
selectImports() -> getAutoConfigurationEntry()
三、部分源码
1、接口:ImportSelector.java
2、接口:DeferredImportSelector
3、实现类:AutoconfigurationImportSelector
4、实现类:AutoConfigurationGroup
四、为什么没有执行selectImports()?
场景一:当getImportGroup()返回null时
场景:当getImportGroup()返回null时
结果:执行AutoConfigurationImportSelector.selectImports()
1、MyDeferredImportSelector.java
package com.example.test;
import org.springframework.context.annotation.DeferredImportSelector;
import org.springframework.core.type.AnnotationMetadata;
import java.util.ArrayList;
import java.util.List;
public class MyDeferredImportSelector implements DeferredImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
System.out.println("===selectImports===");
return new String[0];
}
@Override
public Class<? extends Group> getImportGroup() {
System.out.println("===getImportGroup===");
return null;
}
public static class MyGroup implements Group {
public List<Entry> list = new ArrayList<>();
@Override
public void process(AnnotationMetadata metadata, DeferredImportSelector selector) {
System.out.println("===process===");
}
@Override
public Iterable<Entry> selectImports() {
System.out.println("===MyGroup.selectImports===");
return list;
}
}
}
2、JavaConfig.java
package com.example.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Configuration
@Import(MyDeferredImportSelector.class)
public class JavaConfig {
public static void main(String[] args) {
ApplicationContext ac = new AnnotationConfigApplicationContext(JavaConfig.class);
System.out.println(ac);
}
}
场景二:当getImportGroup()返回自定义Group时
场景:当getImportGroup()返回自定义Group时
结果:不执行AutoConfigurationImportSelector.selectImports()
执行MyGroup.process() -> MyGroup.selectImports()
Q:AutoConfigurationImportSelector.selectImports()为什么没有执行?
A:AutoConfigurationImportSelector.getImportGroup()返回的是AutoConfigurationGroup.class,所以没有执行
五、为什么DeferredImportSelector是延迟加载?
在ConfigurationClassParser.parse()中,先执行重载parse(),然后执行deferredImportSelectorHandler.process()
六、自动配置调用过程
1、AbstractApplicationContext
refresh() -> invokeBeanFactoryPostProcessors()
2、PostProcessorRegistrationDelegate
invokeBeanFactoryPostProcessors_() - > invokeBeanDefinitionRegistryPostProcessors()_
3、ConfigurationClassPostProcessor
postProcessBeanDefinitionRegistry() -> processConfigBeanDefinitions()
4、ConfigurationClassParser
parse() -> processConfigurationClass() -> doProcessConfigurationClass() -> processImports() -> parse()
parse():解析所有的@Configuration类
5、DeferredImportSelectorHandler
process()
6、DeferredImportSelectorGroupingHandler
register() -> processGroupImports()