java – 如果存在使用Spring覆盖外部属性文件的属性

我有一个Spring配置文件中定义了以下属性文件:

<context:property-placeholder location="classpath:project.properties"/> 

现在我想覆盖一些不在类路径中的外部属性文件的属性。

假设我的项目部署在某处,我需要一些动态的配置更改。我不想在容器(tomcat或任何东西)中更新项目代码库。

1.)所以我需要一种方法来更新(覆盖)spring的加载属性文件的值,并在外部属性文件中使用我最近的更新。

2.)如果有人也可以共享刷新预加载的属性,那将是巨大的。

最佳答案

So I need a way that updates (overrides) the values of spring’s loaded properties file with my recent updates in the external property file.

您可以使用PropertyPlaceholderConfigurer

这样一来如果你想使用上下文命名空间

<context:property-placeholder locations="classpath:yourClasspath.properties,file:/some/resource/path/filePropertiesToOverride.properites"/> 

或这样

<bean id="placeholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>classpath:yourClasspath.properties</value>
            <value>file:/some/resource/path/filePropertiesToOverride.properites</value>
        </list>
    </property>
</bean>

根据PropertiesLoaderSupport.setLocations(Resource[])的javadoc

… Note: Properties defined in later files will override properties defined earlier files, in case of overlapping keys. Hence, make sure that the most specific files are the last ones in the given list of locations.

It would be great if somebody could also share the way to refresh the properties that are preloaded.

目前您正在使用PropertyPlaceholderConfigurer。由于PropertyPlaceholderConfigurer是BeanFactoryPostProcessor,它会遍历bean定义(beans.xml的对象表示),并替换属性字符串(例如$ {someProp})。之后,bean被实例化和初始化。因此,没有办法“重新加载”属性。

还有更多的考虑是否要构建一个可以在运行时对属性更改做出反应的应用程序:

>如何在运行时触发更改?例如。一个计时器,用于轮询属性文件以进行更改,JMX,…?
>依赖于属性的类如何被通知有关更新?例如。监听器实现。
>如何同步许多依赖属性的更新?例如。想象如果在Web应用程序请求没有同步的情况下更新属性,会发生什么。请求的一部分可能使用旧的和另一个新的属性。

至少我会建议使用apache commons configuration.但它只是解决一些问题的框架,您仍然必须考虑上述问题的解决方案。

转载注明原文:java – 如果存在使用Spring覆盖外部属性文件的属性 - 代码日志