Java 如何在运行时在spring中重新加载/刷新属性而不重新启动jvm?
如何在运行时在spring中重新加载/刷新属性而不重新启动jvm 我正在寻找一些优雅的东西,它应该适用于Prod。因此,我想JRebel是不可能出现的 目前,我在MYProject.properties中有我的属性Java 如何在运行时在spring中重新加载/刷新属性而不重新启动jvm?,java,spring,refresh,reload,applicationcontext,Java,Spring,Refresh,Reload,Applicationcontext,如何在运行时在spring中重新加载/刷新属性而不重新启动jvm 我正在寻找一些优雅的东西,它应该适用于Prod。因此,我想JRebel是不可能出现的 目前,我在MYProject.properties中有我的属性 oms.url=abbc.com checkin.enabled=true 我的java文件是自动连接的,可以从applicationContext提供的不同属性文件中搜索和使用这些属性: <bean id="applicationProperties" class="myp
oms.url=abbc.com
checkin.enabled=true
我的java文件是自动连接的,可以从applicationContext提供的不同属性文件中搜索和使用这些属性:
<bean id="applicationProperties" class="myproject.config.CustomPropertyPlaceHolder">
<property name="ignoreResourceNotFound" value="true" />
<property name="locations">
<list>
<value>classpath:MyProject.properties</value>
<value>file:${CATALINA_BASE}/lib/MyProject.properties</value>
<!--<value>file:///appl/conf/outlet.properties</value>-->
<value>classpath:db.password</value>
<value>file:${CATALINA_BASE}/lib/db.password</value>
<!-- <ref bean="applPropertiesFromDb" /> -->
</list>
</property>
</bean>
使用
ReloadableResourceBundleMessageSource
但这不会被刷新
private String checkinEnabled;
您必须重新加载
checkinEnabled
变量。考虑像这样实现MessageSourceSpringbean:1.更新applicationContext.xml
<bean id="messageSource" class="com.mycompany.service.DynamicMessageSource" />
3.实现自定义服务以从某个位置读取属性(数据库、属性文件等)。4.在更新属性源时享受属性的动态更新。据我所知,Spring属性解析为java最终静态变量,因此在没有jvm重启的情况下,一旦实例化它们就无法更改。这不完全是Spring属性,而是容器在启动时初始化的Bean。这取决于Bean的性质。如果它与您的示例类似,并且它初始化到DB的连接,即使bean被重新配置,那么旧连接会发生什么情况?在内部,Springbean有一个可以重新启动的生命周期,如果不严重入侵框架代码,很难判断这是可能的。也许可以转而寻找一些JMX功能?@AntonArhipov:是的,我也研究了JMX选项。但我面临的限制是,使用JMX,我必须手动加载所有属性,并且我不再使用注释:@AshishGarg啊,是的。我认为你几乎没有机会。
<bean id="messageSource" class="com.mycompany.service.DynamicMessageSource" />
public class DynamicMessageSource extends AbstractMessageSource {
// Autowire propertiesService
@Override
protected MessageFormat resolveCode(String code, Locale locale) {
String result = propertiesService.getProperty(code);
return new MessageFormat(result, locale);
}
}