我正在使用Spring 3的属性文件。 当Spring初始化它的上下文时,它会加载属性文件并将其放在所有带有@Value注释的bean中。
我希望有可能更新文件中的某些属性,并在服务器上公开JMX,将新属性重新加载到Spring,而无需重新启动服务器,并重新加载其上下文。
我可以通过使用一些 Spring方法来重新加载属性并将它们填充到所有bean中,或者我应该自己写这样的东西来实现它吗?
答案 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热重装属性的原因。