【问题标题】:How to reload Spring 4 context when property file changed属性文件更改时如何重新加载 Spring 4 上下文
【发布时间】:2016-07-05 22:50:02
【问题描述】:

如何在属性文件更改时重新加载 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 如何更改?实际上我必须重新启动我的应用程序才能看到更改。

【问题讨论】:

  • 我不想设置计时器来执行此操作。原生 Spring 类没有办法做到这一点?
  • PropertyPlaceholderConfigurer 仅在应用程序启动时加载。

标签: java spring


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    @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" ) );
        ...
    }
    

    我认为这些属性是在系统第一次启动和所有执行过程中使用的。我不认为你的方法是不可能的,但它会很复杂。

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

    【讨论】:

      猜你喜欢
      • 2012-11-28
      • 2017-01-16
      • 2014-11-26
      • 2018-10-12
      • 2015-02-26
      • 2012-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多