@SpringBootApplication 里面继承了@EnableAutoConfiguration,@EnableAutoConfiguration中又继承了@Import(AutoConfigurationImportSelector.class)
springBoot在启动的时候会统一加载把@Import中的类加载到容器中,
2个版本流程不太一样
//springboot2.0.7版本
在解析@Configuration过程中会执行AutoConfigurationImportSelector中的selectImports()方法,
selectImports()方法会执行getCandidateConfigurations()方法,
//springboot2.0.7版本
//springboot2.2.5版本
this.deferredImportSelectorHandler.process();
handler.processGroupImports();
grouping.getImports().forEach
this.group.process(deferredImport.getConfigurationClass().getMetadata(), deferredImport.getImportSelector());
AutoConfigurationEntry autoConfigurationEntry = ((AutoConfigurationImportSelector) deferredImportSelector)
.getAutoConfigurationEntry(getAutoConfigurationMetadata(), annotationMetadata);
List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
//springboot2.2.5版本
这个方法会加载所有jar包中spring.factories文件的内容,会把spring.factories文件中配置的类加载到spring容器进行管理,
在加载过程中会把一些功能的启动注解给加载,spring-boot-autoconfigure组件包中的spring.factories包含了很多默认开启的功能注解的配置类。比如springboot会默认开启@Transactional的使用功能,之前需要加上
@EnableTransactionManagement。再比如springboot会默认开启@Aspect的使用功能,之前需要加上@EnableAspectJAutoProxy。
举例为什么会自动开启@Aspcet的使用功能:
spring-boot-autoconfigure组件包中的spring.factories中的org.springframework.boot.autoconfigure.aop.AopAutoConfiguration类被加载,
AopAutoConfiguration在之后被解析的时候会通过@ConditionalOnProperty(prefix = "spring.aop", name = "auto", havingValue = "true", matchIfMissing = true)来判断是否
开启@Aspcet的功能。
prefix = "spring.aop", name = "auto"这个值配置在 spring-configuration-metadata.json文件中,可以看到默认配置的值是true,说明springboot默认开启该功能。