如果使用Spring存在,则覆盖外部属性文件中的属性

Sau*_*akh 28 java spring properties

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

<context:property-placeholder location="classpath:project.properties"/> 
Run Code Online (Sandbox Code Playgroud)

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

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

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

2.)如果有人也可以共享刷新预加载属性的方法,那将会很棒.

Ren*_*ink 34

因此,我需要一种方法,使用外部属性文件中的最新更新来更新(覆盖)spring的已加载属性文件的值.

您可以使用PropertyPlaceholderConfigurer.

这种方式如果要使用context命名空间

<context:property-placeholder location="classpath:yourClasspath.properties,file:/some/resource/path/filePropertiesToOverride.properites"/> 
Run Code Online (Sandbox Code Playgroud)

或者这样

<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>
Run Code Online (Sandbox Code Playgroud)

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

...注意:在重叠键的情况下,在以后的文件中定义的属性将覆盖先前定义的文件的属性.因此,请确保最具体的文件是给定位置列表中的最后一个文件.

.

如果有人也可以分享刷新预加载属性的方法,那将会很棒.

目前你正在使用PropertyPlaceholderConfigurer.因为a PropertyPlaceholderConfigurerBeanFactoryPostProcessor遍历bean定义(对象表示beans.xml)并替换属性字符串(例如$ {someProp}).之后,bean被实例化并初始化.因此,没有办法"重新加载"属性.

如果要构建一个可以在运行时对属性更改做出反应的应用程序,还有更多需要考虑的问题:

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

至少我建议使用apache commons配置.但它只是一个解决一些问题的框架,你仍然需要考虑上述问题的解决方案.

  • @SaurabParakh动态改变属性是一项很大的努力,因为有很多事情需要考虑.我更新了我的答案,希望它能帮助你做出决定. (2认同)