我编写了一个PropertyUtils类(来自互联网),它将加载属性
<bean id="propertiesUtil" class="com.myApp.PropertiesUtil" >
<property name="locations">
<list>
<value>classpath:myApp/myApp.properties</value>
</list>
</property>
</bean>
和PropertiesUtil类如下所示
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);
}
}
稍后,我可以通过调用PropertiesUtil.getProperty()方法来获取属性。
但现在我想略微修改它,如果myApp.properties被用户修改/更改,它应该再次加载
我可能需要FileWatcher类
public abstract class FileWatcher extends TimerTask {
private long timeStamp;
private File file;
public FileWatcher(File file) {
this.file = file;
this.timeStamp = file.lastModified();
}
@Override
public final void run() {
long timeStampNew = this.file.lastModified();
if (this.timeStamp != timeStampNew) {
this.timeStamp = timeStampNew;
onChange(this.file);
}
}
protected abstract void onChange(File newFile);
}
但我怀疑是
答案 0 :(得分:10)
以下内容支持您所寻找的内容:
https://commons.apache.org/proper/commons-configuration/userguide/howto_properties.html
PropertiesConfiguration config = new PropertiesConfiguration("usergui.properties");
config.setReloadingStrategy(new FileChangedReloadingStrategy());
这应该可以解决问题。我自己没有用它,但它看起来很简单。
答案 1 :(得分:6)
您可以使用Spring的ReloadableResourceBundleMessageSource类,如下所示:
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
<bean id="myProperties" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<!-- check property file(s) every 1 second -->
<property name="cacheSeconds" value="1"/>
<property name="basenames">
<list>
<value>myApp/myApp</value>
</list>
</property>
</bean>
</beans>
然后您可以调用MessageSource.getMessage()方法来获取属性值。这是一个例子:
package com.example;
import org.springframework.context.ApplicationContext;
import org.springframework.context.MessageSource;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyApp {
public static void main(String[] args) throws InterruptedException {
ApplicationContext ctx = new ClassPathXmlApplicationContext("myApp/MyApp.xml");
MessageSource myProperties = (MessageSource) ctx.getBean("myProperties");
while (true) {
System.out.println(myProperties.getMessage("myApp.propertyOne", null, null));
Thread.sleep(1000);
}
}
}
如果将'myProperties'bean重命名为'messageSource',则可以直接调用ApplicationContext.getMessage(String code,Object [] args,Locale locale)。
对于您的网络应用,请将您的属性文件放在网络应用的类路径之外(因为网络服务器可能会缓存它们)。例如,WEB-INF / conf / myApp.properties
答案 2 :(得分:0)
这可能是更简单的方法:
<util:properties location="classpath:config.properties" id="configProperties" />
<context:property-placeholder properties-ref="configProperties" />
这样,您可以通过注入/访问名为“configProperties”的bean来从任何bean访问您的属性。 不确定这是否是您所需要的,因为无法在运行时修改configProperties。但这是一种干净的方式,你不需要写任何额外的类。