配置属性绑定
javaBean和配置文件绑定
第二种方式:在配置类中绑定javaBean和配置文件
自动配置原理
从@SpringBootApplication注解开始,它里面包括了三个注解:
先看一下第一个注解@SpringBootConfiguration,它里面其实就是一个@Configuration注解,表示这个类是配置类
再看一下@ComponentScan注解,就是扫描包
再看一下第三个注解,这个是自动配置的核心注解:@EnableAutoConfiguration
这个注解中有两点需要关注:
在AutoConfigurationPackage注解中,导入了Registrar.class,这个类中有一个批量注册的方法
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
//仔细看一下这行代码,其实就是根据我们的启动类,找到启动类的包名,然后将这个包下面的所有的组件进行注册
AutoConfigurationPackages.register(registry, (new AutoConfigurationPackages.PackageImport(metadata)).getPackageName());
}
我们再来看一下@EnableAutoConfiguration中导入的AutoConfigurationImportSelector.class:
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());
}
}
我们再来看一下上面的getAutoConfigurationEntry方法,获取所有的自动配置的集合:
我们再来看一下上面调用的getCandidateConfigurations方法:
其实到这里已经有答案了,仔细看一下下面的注释:META-INF/spring.factories
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;
}
当然,也可以在往下跟一下:
我们可以在下面这个包找到相关内容:
我们先来随便看一个自动配置类吧,看一下DispatchServlet: