如何用Spring重新加载属性?

时间:2012-11-06 09:28:34

标签: java spring properties

我正在使用Spring 3的属性文件。 当Spring初始化它的上下文时,它会加载属性文件并将其放在所有带有@Value注释的bean中。

我希望有可能更新文件中的某些属性,并在服务器上公开JMX,将新属性重新加载到Spring,而无需重新启动服务器,并重新加载其上下文。

我可以通过使用一些 Spring方法来重新加载属性并将它们填充到所有bean中,或者我应该自己写这样的东西来实现它吗?

5 个答案:

答案 0 :(得分:7)

我建议用Apache Commons Configuration项目中的java.util.Properties替换PropertiesConfiguration。它支持自动重新加载,通过检测文件何时更改,或通过JMX触发。

答案 1 :(得分:5)

我认为没有共同的方法。最干净的"清洁"一种方法是关闭Spring上下文并从头开始构建它。例如,考虑使用DBCP连接池并更新其数据库连接URL。这意味着必须正确关闭池,然后必须创建新对象,然后还必须更新对池的所有引用。现在,一些bean可能从该池获取连接,并且更新池配置意味着您需要以某种方式重新请求连接。因此,bean可能需要知道如何做到这一点,这并不常见。

我建议使用配置和更新事件创建单独的bean,并将该bean作为依赖关系,以便了解有关配置更改的所有bean。然后,您可以使用Apache Commons Configuration来处理文件更改并传播配置更新。

也许使用JMS是好的(如果你以后要分发你的应用程序)。

答案 2 :(得分:1)

  

Apache为我们提供了使用可重新加载属性文件的实用程序。

<bean id="propertiesReloadingStrategy" class="org.apache.commons.configuration.reloading.FileChangedReloadingStrategy">
    <property name="refreshDelay" value="30000" /> <!-- 30 seconds -->
</bean>

<bean id="reloadableProperties" class="org.apache.commons.configuration.PropertiesConfiguration">
    <constructor-arg value="file:/web/${weblogic.Domain}/${weblogic.Name}/${app.Name}/reloadable_cfg/Reloadable.properties"/>
    <property name="reloadingStrategy" ref="propertiesReloadingStrategy"/>
</bean>

答案 3 :(得分:0)

使用与spring相同的apache如下:

@Component
public class ApplicationProperties {
    private PropertiesConfiguration configuration;

    @PostConstruct
    private void init() {
        try {
            String filePath = "/opt/files/myproperties.properties";
            System.out.println("Loading the properties file: " + filePath);
            configuration = new PropertiesConfiguration(filePath);

            //Create new FileChangedReloadingStrategy to reload the properties file based on the given time interval
            FileChangedReloadingStrategy fileChangedReloadingStrategy = new FileChangedReloadingStrategy();
           fileChangedReloadingStrategy.setRefreshDelay(60*1000);
            configuration.setReloadingStrategy(fileChangedReloadingStrategy);
        } catch (ConfigurationException e) {
            e.printStackTrace();
        }
    }

    public String getProperty(String key) {
        return (String) configuration.getProperty(key);
    }

    public void setProperty(String key, Object value) {
        configuration.setProperty(key, value);
    }

    public void save() {
        try {
            configuration.save();
        } catch (ConfigurationException e) {
            e.printStackTrace();
        }
    }
}

答案 4 :(得分:0)

尽管这里有人建议使用外部方式使用属性(Spring自己使用属性文件的方式外部)。该答案正是您在Spring Boot和Java EE中寻找https://stackoverflow.com/a/52648630/39998热重装属性的原因。