从spring上下文实例化自定义PropertySourcesPlaceholderConfigurer

时间:2014-01-23 11:05:57

标签: java spring

我想在spring上下文xml中定义一个自定义PropertySourcesPlaceholderConfigurer。我想在那里使用多个PropertySources,这样我就可以从几个属性文件中加载部分配置,并通过我的自定义PropertySource实现动态地提供其他部分。优点是,只需修改xml弹簧配置就可以轻松调整加载这些属性源的顺序。

这里我遇到了一个问题:如何定义一个任意的PropertySources列表并将其注入PropertySourcesPlaceholderConfigurer,以便它使用我定义的来源?

似乎是一个应该由春天提供的基本事物,但从昨天起我无法找到办法。使用命名空间可以让我加载几个属性文件,但我还需要定义PropertySourcesPlaceholderConfigurer的id(正如其他项目引用它),我也想使用我的自定义实现。这就是我明确定义bean而不使用命名空间的原因。

最直观的方法是将PropertySources列表注入PropertySourcesPlaceholderConfigurer,如下所示:

<bean id="applicationPropertyPlaceholderConfigurer" class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
    <property name="ignoreUnresolvablePlaceholders" value="true" />
    <property name="ignoreResourceNotFound" value="true" />     
    <property name="order" value="0"/>
    <property name="propertySources">
        <list>
             <!-- my PropertySource objects -->
        </list>
    </property> 
</bean>

但遗憾的是,propertySources的类型为PropertySources,不接受列表。 PropertySources接口有一个唯一的实现者,它是MutablePropertySources,它确实存储了PropertySource对象的列表,但没有构造函数或setter,我可以通过它来注入这个列表。它只有添加*(PropertySource)方法。

我现在看到的唯一解决方法是实现我自己的PropertySources类,扩展MutablePropertySources,它将在创建时接受PropertySource对象列表,并通过使用add *(PropertySource)方法手动添加它。但是为什么需要提供太多的解决方法来提供我认为应该是引入PropertySources的主要原因(具有灵活的配置可以从spring配置级别进行管理)。

请澄清我的错误:)

2 个答案:

答案 0 :(得分:2)

而不是

<property name="propertySources">
        <list>
             <!-- my PropertySource objects -->
        </list>
</property> 

使用类似:

    <property name="locations">
        <list>
            <value>/WEB-INF/my.properties</value>
            <value>classpath:my.properties</value>
        </list>
    </property>

答案 1 :(得分:1)

我使用java配置,不知道春季版本之间是否有任何字段发生变化,但也许它会对你有所帮助:

 public static PropertySourcesPlaceholderConfigurer getPropertySourcesPlaceholderConfigurer() {
        PropertySourcesPlaceholderConfigurer properties = new PropertySourcesPlaceholderConfigurer();
        properties.setLocations(new ClassPathResource[]{
                new ClassPathResource("config/file1.properties"),
                new ClassPathResource("config/file2.properties")
        });
        properties.setLocalOverride(true);
        properties.setBeanName("beanName");
        properties.setIgnoreResourceNotFound(true);
        return properties;
    }