How to load properties file in Spring 4 using annotations?

I have a simple application in which I use several file properties to retrieve content edited by other users (links to sites, etc.).

The class in which I load the properties is as follows:

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

Some of the properties files:

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

This works fine, but if I make changes to the properties file, I have to restart the application to visualize the changes made.

Is it possible, if I move the location to disk instead of classpath, reload it periodically or manually? I do not want this to be done automatically upon change, since I want to control when it will be done / updated.

+10
source share
3 answers

It works. Requires Java 7, Apache, Apache commons lang (v2.6) logging and general Apache 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); } } 

and test it with:

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

The output when changing test.properties is something like this (the original contents of test.props were key = value, later changed to running the command mid = 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 

You can also review the Official Spring Framework Refreshable beans reference documentation using DSL like Groovy.

+10
source

PropertyPlaceholderConfigurer must be overridden to reload new properties

You need to rewrite the processProperties method to make a StringValueResolver that contains properties that have become loadable. This is my code.

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

here is the configuration for properties-config.xml . All of these properties can be reloaded at run time as a prototype bean.

 <bean id="propertyConfigurer" class="com.cn21.mail189.analysis.commons.expand.ReloadablePropertyPlaceholderConfigurer"> <property name="ignoreUnresolvablePlaceholders" value="true" /> <property name="locations"> <list> <!-- database config --> <value>classpath:spring/dbconfig.properties</value> <!-- app config --> <value>classpath:spring/app.properties</value> <!-- some other config --> <value>classpath:xxxx.properties</value> </list> </property> </bean>` 
+6
source

Inside applicationContext.xml

 <bean id="beanId" class="org.apache.commons.configuration.reloading.FileChangedReloadingStrategy"> <property name="refreshDelay" value="30000" /> <!-- 30 seconds --> </bean> <bean id="reloadableProperties" class="org.apache.commons.configuration.PropertiesConfiguration"> <constructor-arg value="file:/web/${weblogic.Domain}/${weblogic.Name}/${app.Name}/reloadable_cfg/Reloadable.properties"/> <property name="reloadingStrategy" ref="propertiesReloadingStrategy"/> </bean> 
0
source

Source: https://habr.com/ru/post/976124/


All Articles