关于 PropertyOverrideConfigurer PropertySourcesPlaceholderConfigurer
前言
它们是 Spring
提供的基础组件,用于将 bean
属性通过配置化动态赋值,比如本地配置文件等,乍一听有点类似 Spring Boot
的 外部化配置
机制,我感觉这就是 外部化配置
思维的雏形
PropertyOverrideConfigurer
- 它是一种
PUSH
的处理方式,将配置中的属性主动推送(赋值)给bean
实例 - 它通过
beanName.property=value
的形式来给bean
属性赋值,本质上是对BeanDefinition PorpertyValues
的操作 - 它看上去很接近
Spring Boot
的ConfigurationProperties
机制,当然功能远远没有后者强大
demo
public class PropertyOverrideConfigurerTest {
@Test
public void test() {
AnnotationConfigApplicationContext context
= new AnnotationConfigApplicationContext(Config.class);
Config.A bean = context.getBean(Config.A.class);
System.out.println(bean.getName());
}
@Configuration
static class Config {
@Bean
public PropertyOverrideConfigurer propertyOverrideConfigurer() {
PropertyOverrideConfigurer propertyOverrideConfigurer = new PropertyOverrideConfigurer();
propertyOverrideConfigurer.setLocation(new ClassPathResource("application.properties"));
return propertyOverrideConfigurer;
}
@Bean
public A a() {
return new A();
}
static class A {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
}
}
- 示例中我们注册了一个
PropertyOverrideConfigurer
,并为其指定配置文件路径classpath:/application.properties
- 同时注册了一个
bean
实例A
,并未为其指定name
属性 - 则此时我们可以在配置文件
classpath:/application.properties
中通过a.name=xxx
为其指定属性 - 很类似于
Spring Boot
的ConfigurationProperties
,当然ConfigurationProperties
支持的场景更加复杂灵活
PropertySourcesPlaceholderConfigurer
- 跟
PropertyOverrideConfigurer
相反,它是PULL
的处理方式:通过占位符
为bean
实例指定属性,然后从PropertySources
中解析对应的属性 - 其实类似机制的还有一个
PropertyPlaceholderConfigurer
,但该类局限于指定的 配置源,已被标记为@Deprecated
PropertySourcesPlaceholderConfigurer
的属性源即Environment#propertySources
,在Spring Boot
中配合外部化配置
就更加强大了Spring Boot
默认自动装配的就是PropertySourcesPlaceholderConfigurer
,详情见PropertyPlaceholderAutoConfiguration
- 此类就不
demo
示例了,在任一Spring Boot
工程下的application.properties
中使用占位符就是此类场景
总结
PropertyOverrideConfigurer
和PropertySourcesPlaceholderConfigurer
是Spring
提供的基础组件,用于实现bean
属性和配置源
的关联PropertyOverrideConfigurer
是配置源PUSH
到bean
属性的模式,有点类似于Spring Boot
的ConfigurationProperties
机制PropertySourcesPlaceholderConfigurer
是占位符
标识的bean
属性从配置源PULL
的机制,结合Spring Boot
的外部化配置
更加强大,也是Spring Boot
默认自动装配的实例
版权声明:本文为weixin_42189048原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。