我有一个简单的应用程序,其中我使用几个属性文件来获取其他用户编辑的内容(指向网站的链接等)。
我加载属性的类如下所示:
@Configuration @PropertySource("classpath:salestipsWhitelist.properties") public class SalestipsWhitelist { @Autowired Environment env; public Environment getEnv() { return env; } public void setEnv(Environment env) { this.env = env; } @Bean public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() { return new PropertySourcesPlaceholderConfigurer(); } }
一些属性文件:
UPS_MPP_M_L=True UPS_MPP_M_M=True UPS_MPP_M_MP=True UPS_MPP_M_S=True
这可以正常工作,但是如果我对properties-file进行更改,则必须重新加载应用程序以可视化所做的任何更改。
如果我将位置移动到磁盘而不是类路径,是否可以定期或手动重新加载?我不希望更改时自动完成此操作,因为我想控制何时完成/更新。
需要Java 7,Apache Commons日志记录,Apache Commons lang(v2.6)和Apache Commons Configuration:
package corejava.reloadTest; import org.apache.commons.configuration.ConfigurationException; import org.apache.commons.configuration.PropertiesConfiguration; import org.apache.commons.configuration.reloading.FileChangedReloadingStrategy; public class MyApplicationProperties { private static PropertiesConfiguration configuration = null; static { try { configuration = new PropertiesConfiguration("test.properties"); } catch (ConfigurationException e) { e.printStackTrace(); } configuration.setReloadingStrategy(new FileChangedReloadingStrategy()); } public static synchronized String getProperty(final String key) { return (String) configuration.getProperty(key); } }
并使用以下命令进行测试:
package corejava.reloadTest; public class TestReloading { public static void main(String[] args) { while (true) { try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(MyApplicationProperties.getProperty("key")); } } }
更改test.properties时的输出是这样的(test.props的原始内容为key = value,后来在程序执行中更改为key = value1):
value value value value value Jan 17, 2015 2:05:26 PM org.apache.commons.configuration.PropertiesConfiguration reload INFO: Reloading configuration. URL is file:/D:/tools/workspace /AutoReloadConfigUsingApacheCommons/resources/test.properties value1 value1 value1