使用BeanDefinitionRegistryPostProcessor从org.springframework.core.env.PropertySource加载配置POJO一次

时间:2018-07-03 21:51:45

标签: java spring spring-boot pojo

我正在动态创建Spring bean(使用https://scanningpages.wordpress.com/2017/07/28/spring-dynamic-beans/中描述的方法)

@Configuration
class Conf {

    @Bean
    static BeanDefinitionRegistryPostProcessor beanPostProcessor(final ConfigurableEnvironment environment) {
    ...
    }

但是无法通过POJO中的常用方式加载属性对象:

@Configuration
@ConfigurationProperties(prefix = "foo") 
public class FooProperties {

并作为附加参数自动连线到beanPostProcessor(根本不起作用)。

现在我必须像这样迭代属性:

static private FooPorperties parseProperties(ConfigurableEnvironment environment) {
    for(PropertySource source : environment.getPropertySources()) {
        if(source instanceof EnumerablePropertySource) {
            EnumerablePropertySource propertySource = (EnumerablePropertySource) source;
            for(String property : propertySource.getPropertyNames()) {
                if (property.startsWith("foo")) {
                    System.out.println(property);
                    // TODO set FooProperties
                }
            }
        }
    }

我的问题是,有没有一种方法可以将这些PropertySource映射到我的POJO,而无需手动进行迭代?

1 个答案:

答案 0 :(得分:1)

我有一个丑陋的方式...

public static FooProperties buildProperties(ConfigurableEnvironment environment) {
    FooProperties fooProperties = new FooProperties();

    if (environment != null) {
        MutablePropertySources propertySources = environment.getPropertySources();
        new RelaxedDataBinder(fooProperties, "foo").bind(new PropertySourcesPropertyValues(propertySources));
    }

    return fooProperties;
}

然后,您可以在beanPostProcessor中使用buildProperties(configurableEnvironment)。

对于Spring Boot 2. +版,您必须使用refactored binding API