它们是 Spring
提供的基础组件,用于将 bean
属性通过配置化动态赋值,比如本地配置文件等,乍一听有点类似 Spring Boot
的 外部化配置
机制,我感觉这就是 外部化配置
思维的雏形
PUSH
的处理方式,将配置中的属性主动推送(赋值)给 bean
实例beanName.property=value
的形式来给 bean
属性赋值,本质上是对 BeanDefinition PorpertyValues
的操作Spring Boot
的 ConfigurationProperties
机制,当然功能远远没有后者强大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
支持的场景更加复杂灵活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
默认自动装配的实例