ConfigurationProperties配置文件原理
ConfigurationProperties配置原理
我们知道@EnableConfigurationProperties和@ConfigurationProperties的注解是配合使用的。那么我们分别分析下这两个注解的作用。
@EnableConfigurationProperties
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(EnableConfigurationPropertiesImportSelector.class)
public @interface EnableConfigurationProperties {
/**
* Convenient way to quickly register {@link ConfigurationProperties} annotated beans
* with Spring. Standard Spring Beans will also be scanned regardless of this value.
* @return {@link ConfigurationProperties} annotated beans to register
*/
Class<?>[] value() default {
};
}
我们通过代码看到了其存在一个@Import注解,其引入的EnableConfigurationPropertiesImportSelector.class类,不清楚的可以去网上查询下相关资料。@Import注解可以引入相关的Bean,然后自动会往容器中注入相关的对象Bean。
class EnableConfigurationPropertiesImportSelector implements ImportSelector {
private static final String[] IMPORTS = {
ConfigurationPropertiesBeanRegistrar.class.getName(),
ConfigurationPropertiesBindingPostProcessorRegistrar.class.getName() };
@Override
public String[] selectImports(AnnotationMetadata metadata) {
return IMPORTS;
}
....省略以下代码....
}
可以知道其引入了ConfigurationPropertiesBeanRegistrar和ConfigurationPropertiesBindingPostProcessorRegistrar两个对象,所以我们思考下,这两个类究竟是干什么的呢??我们一一分析
ConfigurationPropertiesBeanRegistrar.class
public static class ConfigurationPropertiesBeanRegistrar implements ImportBeanDefinitionRegistrar {
//可以看出来,通过注解元素去往容器中注册相应的BeanDefinition
@Override
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
getTypes(metadata).forEach((type) -