如何使用注释在Spring 4中重新加载属性文件?

我有一个简单的应用程序,我使用几个属性文件来获取其他用户编辑的内容(链接到网站等)。

我加载属性的类看起来像这样:

@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 

这工作正常,但如果我对属性文件进行更改,我必须重新加载应用程序以可视化所做的任何更改。

如果我将位置移动到磁盘而不是类路径,是否有可能定期或手动重新加载? 我不希望在更改时自动完成此操作,因为我想控制何时完成/更新。

这是一种享受。 需要Java 7,Apache commons日志记录,Apache commons lang(v2.6)和Apache commons配置:

 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 mid-program execution):

 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 

您还可以考虑官方Spring框架参考文档可 刷新的bean ,使用像Groovy这样的DSL

需要重写PropertyPlaceholderConfigurer以重新加载新属性

您需要重写processProperties方法,以使包含属性的StringValueResolver变为可加载。 这是我的代码

 import java.io.IOException; import java.util.Properties; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer; import org.springframework.util.PropertyPlaceholderHelper; import org.springframework.util.PropertyPlaceholderHelper.PlaceholderResolver; import org.springframework.util.StringValueResolver; public class ReloadablePropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer { private ReloadablePlaceholderResolvingStringValueResolver reloadableValueResolver; public void reloadProperties() throws IOException { Properties props = mergeProperties(); this.reloadableValueResolver.refreshProperties(props); } @Override protected void processProperties(ConfigurableListableBeanFactory beanFactoryToProcess, Properties props) throws BeansException { this.reloadableValueResolver = new ReloadablePlaceholderResolvingStringValueResolver(props); StringValueResolver valueResolver = this.reloadableValueResolver; this.doProcessProperties(beanFactoryToProcess, valueResolver); } private class ReloadablePlaceholderResolvingStringValueResolver implements StringValueResolver { private final PropertyPlaceholderHelper helper; private final ReloadablePropertyPlaceholderConfigurerResolver resolver; public ReloadablePlaceholderResolvingStringValueResolver(Properties props) { this.helper = new PropertyPlaceholderHelper(placeholderPrefix, placeholderSuffix, valueSeparator, ignoreUnresolvablePlaceholders); this.resolver = new ReloadablePropertyPlaceholderConfigurerResolver(props); } @Override public String resolveStringValue(String strVal) throws BeansException { String value = this.helper.replacePlaceholders(strVal, this.resolver); return (value.equals(nullValue) ? null : value); } private void refreshProperties(Properties props){ this.resolver.setProps(props); } } private class ReloadablePropertyPlaceholderConfigurerResolver implements PlaceholderResolver { private Properties props; private ReloadablePropertyPlaceholderConfigurerResolver(Properties props) { this.props = props; } @Override public String resolvePlaceholder(String placeholderName) { return ReloadablePropertyPlaceholderConfigurer.this.resolvePlaceholder(placeholderName, props, SYSTEM_PROPERTIES_MODE_FALLBACK); } public void setProps(Properties props) { this.props = props; } } } 

这里是properties-config.xml的配置。所有这些属性都可以在运行时作为原型bean重新加载。

      classpath:spring/dbconfig.properties  classpath:spring/app.properties  classpath:xxxx.properties   ` 

在applicationContext.xml里面