我正在将属性文件加载到一个类,然后在整个应用程序中使用该类来获取它们。
public class PropertiesUtil extends PropertyPlaceholderConfigurer {
private static Map<String, String> properties = new HashMap<String, String>();
@Override
protected void loadProperties(final Properties props) throws IOException {
super.loadProperties(props);
for (final Object key : props.keySet()) {
properties.put((String) key, props.getProperty((String) key));
}
}
public String getProperty(final String name) {
return properties.get(name);
}
}
并在ApplicationContext.xml中
<bean id="propertiesUtil"
class="com.test.PropertiesUtil">
<property name="locations">
<list>
<value>classpath:test/test.properties</value>
</list>
</property>
</bean>
现在我想确保每当更改属性文件时重新加载它。
我有一个监听器类,它与tomcat服务器一起初始化。 我已经为文件观察者编写了以下逻辑
TimerTask task = new FileWatcher(new File("c:\\temp-reb\\config\\config.properties")) {
/*
* (non-Javadoc)
* @see com.belgacom.rosy.rebecca.utils.FileWatcher#onChange(java.io.File)
*/
@Override
protected void onChange(File file) {
loadServiceProperties(file);
loadMetadata();
}
};
Timer timer = new Timer();
timer.schedule(task, new Date(), Long.valueOf(properties.getProperty("properties.file.timer.schedule"))); // repeat the check every second
问题是
- FileWatcher需要运行路径,我不想硬编码
- 如何告诉spring调用属性以明确重新加载!
醇>
答案 0 :(得分:3)
- FileWatcher需要运行路径,我不想硬编码
醇>
只需将相对路径设置为同一项目文件夹中的资源目录,您可以使用getResource()
方法获取该路径。您还可以使用system property访问user.dir
,这是使用工作目录。
File f = new File(System.getProperty("user.dir")+ "/test.properties");
System.out.println(f.getAbsolutePath());
2。如何告诉spring调用属性来显式重新加载!
你现在这样做的方式对我来说似乎没问题。可能还有其他方法,但我没有看到上述过程中存在任何缺陷。
答案 1 :(得分:1)
这条蜿蜒的道路通往黑暗的地方。每个定义的Spring实例化并维护对单例的引用。因此,如果客户端注入依赖项,保留它,并且应用程序上下文开始提供新bean,那么您将处于一个真正丑陋的状态。如果你不使用你的属性作为bean属性你应该没问题,但混合它不是真正的方法。
如果有的话,我会尝试通过重新加载属性来限制受影响的bean数量并将它们放在特殊范围内。这样,每当您的范围发生变化时,您将获得具有最新配置的新bean。至少你将拥有一个已定义的属性生命周期,并确切地知道你所面对的是什么。