为什么ConfigurationPropertiesBindingPostProcessor只考虑一个PropertySourcesPlaceholderConfigurer?

时间:2016-02-25 12:23:11

标签: spring spring-boot

只要使用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是否有充分的理由?

0 个答案:

没有答案