Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在运行时在spring中重新加载/刷新属性而不重新启动jvm?_Java_Spring_Refresh_Reload_Applicationcontext - Fatal编程技术网

Java 如何在运行时在spring中重新加载/刷新属性而不重新启动jvm?

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

如何在运行时在spring中重新加载/刷新属性而不重新启动jvm

我正在寻找一些优雅的东西,它应该适用于Prod。因此,我想JRebel是不可能出现的

目前,我在MYProject.properties中有我的属性

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