@ConfigurationProperties
@ConfigurationProperties
是springboot中注解,用于将主配置文件(application.properties或者“application.yml” )中的属性,映射到实体类中对应的属性。 意思就是把主配置文件中配置属性设置到对应的Bean属性上。
常见使用方式:
@ConfigurationProperties + @Component
注解到bean定义类上@ConfigurationProperties + @Bean
注解在配置类的bean定义方法上@ConfigurationProperties
注解到普通类然后通过@EnableConfigurationProperties
定义为bean
@Bean,@Component
这种我们可以理解,两个注解都能标识一个Bean.
@EnableConfigurationProperties
是如何让其成为一个bean的呢?
@EnableConfigurationProperties源码分析:
@EnableConfigurationProperties
注解会导入一个EnableConfigurationPropertiesImportSelector
类,其selectImports方法返回的类,将注册为beandefinition。
@Override public String[] selectImports(AnnotationMetadata metadata) { 获取@EnableConfigurationProperties的参数信息 MultiValueMap<String, Object> attributes = metadata.getAllAnnotationAttributes( EnableConfigurationProperties.class.getName(), false); Object[] type = attributes == null ? null : (Object[]) attributes.getFirst("value"); 参数没有值,注册1个 if (type == null || type.length == 0) { return new String[] { ConfigurationPropertiesBindingPostProcessorRegistrar.class .getName() }; } 参数有值,注册两个 return new String[] { ConfigurationPropertiesBeanRegistrar.class.getName(), ConfigurationPropertiesBindingPostProcessorRegistrar.class.getName() }; }
总的来说会注册两个类:
ConfigurationPropertiesBindingPostProcessorRegistrar
ConfigurationPropertiesBeanRegistrar
1.ConfigurationPropertiesBindingPostProcessorRegistrar
: 看名字我们也可以看出ConfigurationPropertiesBindingPostProcessor
注册器,没错就是用来注册ConfigurationPropertiesBindingPostProcessor
这个BeanPostProcessor的。BeanPostProcessor会在创建bean的时候,被执行处理Bean相关信息。ConfigurationPropertiesBindingPostProcessor
这个BeanPostProcessor是就是用来解析Bean上的@ConfigurationProperties注解的。
ConfigurationPropertiesBindingPostProcessor
会检查Bean是否有 @ConfigurationPropertie
s,如果有就绑定相关配置属性到本bean的相关属性上。
2.ConfigurationPropertiesBeanRegistrar
: 看名字,ConfigurationPropertiesBean
注册器,ConfigurationPropertiesBeanRegistrar
是在@ConfigurationProperties的value属性有值的情况下注册的。 例如:
@EnableConfigurationProperties({ EurekaDashboardProperties.class, InstanceRegistryProperties.class })
ConfigurationPropertiesBeanRegistrar
实现了ImportBeanDefinitionRegistrar
接口,所以他的registerBeanDefinitions方法,也会注册Bean. 注册就是@EnableConfigurationProperties的value值,例如例子中EurekaDashboardProperties.class,InstanceRegistryProperties.class
由此我们可以看出:@Component, @Bean , ConfigurationPropertiesBeanRegistrar
都是为了告诉spring,对应的类是一个Bean,spring要去加载,解析,创建Bean. 而ConfigurationPropertiesBindingPostProcessor
的工作就是完成配置信息到Bean属性的绑定工作。
@EnableConfigurationProperties的目的
- 保证容器中有解析ConfigurationProperties注解的BeanPostProcessor
- 向容器内注入value对应的BeanDefinition
idea中,在主配置文件ctrl+鼠标 能看到这对应的属性被哪个@ConfigurationProperties修饰的属性类使用
@ConfigurationProperties
是针对主配置文件的。但是我们不想所有的配置都放到主配置文件中怎么办????
@PropertySource
@PropertySource 是spring的注解 加载指定的属性文件的配置到 Spring 的 Environment 中。可以配合 @Value 和 @ConfigurationProperties 使用。
用法:
@Configuration+ @PropertySource+Environment
@Configuration+ @PropertySource+@Value
@Configuration+ @PropertySource+@ConfigurationProperties
@Configuration本质也是告诉spring这是一个bean.
my.name=helloworld my.age=8
@Configuration+ @PropertySource+Environment
@Configuration @PropertySource("classpath:hellword.properties") public class HelloWorldConfig { @Autowired private Environment env; }
@Configuration+ @PropertySource+@Value
@Configuration @PropertySource("classpath:hellword.properties") public class HelloWorldConfig { @Value(${my.name}) private String name; }
@Configuration+ @PropertySource+@ConfigurationProperties
@PropertySource
指定加载哪个文件,@ConfigurationProperties
指定加载文件中的哪一类属性。@PropertySource+@ConfigurationProperties
在一起解决了@ConfigurationProperties
只能加载主文件内属性问题。
@Configuration @PropertySource("classpath:hellword.properties") @ConfigurationProperties(prefix = "my") public class HelloWorldConfig { private String name; }
总结:
灵活利用这两个注解,能够把配置信息安排有层次感。