SpringBoot 自动装配原理
@SpringBootApplication 注解点进去如下:
@SpringBootApplication 有3个重要的注解分别是
@SpringBootConfiguration 就是一个配置类
@EnableAutoConfiguration
@ComponentScan
@Import(AutoConfigurationImportSelector.class)
@SpringBootConfiguration
要想当前程序可以申明成自动注入装配的。我们一般可以在类上添加 @Component ,但是这个 @SpringBootConfiguration 里并没有看到。点击 Configuration 进入
@Configuration
点击 @Configuration 进入,可以看到 Configuration 上已经有了 @Component 的注解了。注解有继承关系。SpringBootConfiguration也会有该功能
@EnableAutoConfiguration
EnableAutoConfiguration 中有两个重要的注解分别是 @AutoConfigurationPackage、@Import(AutoConfigurationImportSelector.class)
@AutoConfigurationPackage
AutoConfigurationPackage 再点进去看,有一个@Import(AutoConfigurationPackages.Registrar.class),返回一个 Registrar 方法如下
@Import(AutoConfigurationImportSelector.class)
进入 AutoConfigurationImportSelector.class 类中,有一个方法 getCandidateConfigurations 。这个方法就是获取 spring.factories 配置文件中的Key,Value 属性值。那么这个Key就是 this.getSpringFactoriesLoaderFactoryClass() 方法返回的值 EnableAutoConfiguration
getCandidateConfigurations()
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(
this.getSpringFactoriesLoaderFactoryClass(),
this.getBeanClassLoader());
Assert.notEmpty(configurations,
"No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");
return configurations;
}
this.getSpringFactoriesLoaderFactoryClass()
返回值为 EnableAutoConfiguration
到 SpringBoot-autoconfigure 中查看 spring.factories 文件,可以看到其中一对的 K , V属性值,找到 EnableAutoConfiguration 这个key 属性,可以看到很多属性
spring.factories 文件
断点调试 getCandidateConfigurations()
看到 List<String> configurations 中的值和 spring.factories 文件 中一致的