如何在属性文件更改时重新加载Spring 4上下文

时间:2016-07-05 10:18:28

标签: java spring

当属性文件发生变化时,如何重新加载Spring4上下文?

实际上我使用@Value("$param{myParam}")并从applicationContext.xml中获取占位符,如下所示:

<bean id="param-PropertyPlaceholder"
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
    p:location="file:${confdir}/parameters.properties" p:placeholder-prefix="$param{" />

当我的属性文件发生变化时,我怎样才能更改@Value?实际上我必须重启我的应用程序才能看到更改。

2 个答案:

答案 0 :(得分:1)

你不想那样。许多应用程序依赖于应用程序上下文的单例bean在整个应用程序生命周期中是相同的。但是可以要求任何bean重新加载一些值,或者你可以将singleton bean的一些属性代理到协议的属性,这些属性将在每次调用时从头开始重建。

我认为您有一个完全可以接受的设计问题,但解决方案是按需从PropertyPlaceholderConfigurer中提取的值进行重新加载。使用框架来擅长什么,不要试图让他们做他们的开发人员无法想象的事情。

答案 1 :(得分:0)

我将为该建议创建一个方法并决定它何时执行......

@Autowired
private MyBean1 myBean1

@Autowired
private MyBean2 myBean2

public void loadNewProperties() {
    // Read new properties into newProps
    ...
    // Load the new properties into bean fields
    myBean1.setPropertyA( newPropsp.getProperty( "property.A" ) );
    myBean2.setPropertyB( newPropsp.getProperty( "property.B" ) );
    ...
}

我认为在系统首次启动时以及在所有执行期间都会使用这些属性。我不认为你的方法是不可能的,但它会很复杂。

如果属性不断变化,您必须考虑使用一些数据源。