只要使用ConfigurationPropertiesBindingPostProcessor
注释bean以便将属性值绑定到bean,就会使用@ConfigurationProperties
。
ConfigurationPropertiesBindingPostProcessor
(Spring Boot版本1.3.1)的实现确定了方法deducePropertySources()
中的属性源,如下所示:
private PropertySources deducePropertySources() {
PropertySourcesPlaceholderConfigurer configurer = getSinglePropertySourcesPlaceholderConfigurer();
if (configurer != null) {
// Flatten the sources into a single list so they can be iterated
return new FlatPropertySources(configurer.getAppliedPropertySources());
}
...
}
在调查getSinglePropertySourcesPlaceholderConfigurer()
时,您会发现只有第一个PropertySourcesPlaceholderConfigurer
被采用而其他人被忽略。
这是什么原因?
在我的Spring配置中,我有多个PropertySourcesPlaceholderConfigurer
bean,我希望在绑定属性值时使用所有这些bean。
当然,我可以通过定义如下所示的接口MyPropertySourceResources
来创建解决方法:
public interface MyPropertySourceResources {
List<Resource> getResources();
}
在我的Spring配置中,我只定义了一个PropertySourcesPlaceholderConfigurer
MyResourceLocartion
列表作为参数:
@Bean
public static PropertySourcesPlaceholderConfigurer gdaPropertySourcesPlaceholderConfigurer(
List<MyPropertySourceResources> propertySourceResources) {
PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer();
List<Resource> allResources = propertySourceResources.stream()
.flatMap(p -> p.getResources().stream())
.collect(Collectors.toList());
propertySourcesPlaceholderConfigurer.setLocations(allResources.toArray(new Resource[allResources.size()]));
return propertySourcesPlaceholderConfigurer;
}
@Bean
public MyPropertySourceResources gdaPropertySourceResources() {
return () -> Arrays.asList(new FileSystemResource(new File("path/to/my.properties")));
}
在此解决方案中,每个模块都定义了自己的MyPropertySourceResources
bean,所有这些bean都将用于构建唯一的PropertySourcesPlaceholderConfigurer
。
但回到我的问题:ConfigurationPropertiesBindingPostProcessor
只考虑一个PropertySourcesPlaceholderConfigurer
是否有充分的理由?