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

时间:2014-01-09 08:40:59

标签: java spring properties

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:34)

  

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

您可以使用PropertyPlaceholderConfigurer

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

<context:property-placeholder location="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
  

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

  

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

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

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

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

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

答案 1 :(得分:0)

在弹簧靴2中,它是

java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties

您可以在https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html

中获取完整的详细信息