Como posso recarregar o arquivo de propriedades no Spring 4 usando annotations?

Eu tenho um aplicativo simples, onde estou usando vários arquivos de propriedades para buscar o conteúdo editado por outros usuários (links para sites, etc).

A class na qual eu carrego as propriedades é assim:

@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(); } } 

Algumas das propriedades do arquivo:

 UPS_MPP_M_L=True UPS_MPP_M_M=True UPS_MPP_M_MP=True UPS_MPP_M_S=True 

Isso funciona bem, mas se eu fizer alterações no arquivo de propriedades, tenho que recarregar o aplicativo para visualizar as alterações feitas.

É possível, se eu mover o local para o disco em vez do caminho de class, para recarregá-lo periodicamente ou manualmente? Eu não quero que isso seja feito automaticamente na mudança, como eu quero ter controle sobre quando isso é feito / atualizado.

Isso funciona um deleite. Requer o Java 7, o log do Apache commons, o Apache commons lang (v2.6) e o 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); } } 

e testá-lo com:

 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")); } } } 

Saída ao alterar test.properties é algo assim (o conteúdo original de test.props era key = value, posteriormente alterado para 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 

Você também pode considerar os beans Atualizáveis ​​da Documentação de Referência do Spring Framework , usando um DSL como o Groovy para isso.

o PropertyPlaceholderConfigurer precisa ser substituído para recarregar as novas propriedades

Você precisa rewrite o método processProperties para fazer com que o StringValueResolver que contém as propriedades se StringValueResolver carregáveis. Este é o meu código

 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; } } } 

Aqui está a configuração de properties-config.xml Todas essas propriedades podem ser recarregadas em tempo de execução como um bean de protótipo.

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

Inside applicationContext.xml

         
Intereting Posts