当前位置:  开发笔记 > 运维 > 正文

重新加载/刷新Spring配置文件而不重新启动servlet容器

如何解决《重新加载/刷新Spring配置文件而不重新启动servlet容器》经验,为你挑选了3个好方法。

如何在不重新启动servlet容器的情况下刷新Spring配置文件?

我正在寻找除JRebel之外的解决方案.



1> Guillaume..:

那么,在测试你的应用程序时执行这样的上下文重新加载会很有用.

您可以尝试refresh其中一个AbstractRefreshableApplicationContext类的方法:它不会刷新以前的instanciated bean,但下一次调用上下文将返回刷新的bean.

import java.io.File;
import java.io.IOException;

import org.apache.commons.io.FileUtils;
import org.springframework.context.support.FileSystemXmlApplicationContext;

public class ReloadSpringContext {

    final static String header = "\n" +
        "\n";

    final static String contextA =
        "\n" +
            "\t\t\n" +
        "";

    final static String contextB =
        "\n" +
            "\t\t\n" +
        "";

    public static void main(String[] args) throws IOException {
        //create a single context file
        final File contextFile = File.createTempFile("testSpringContext", ".xml");

        //write the first context into it
        FileUtils.writeStringToFile(contextFile, header + contextA);

        //create a spring context
        FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext(
            new String[]{contextFile.getPath()}
        );

        //echo the bean 'test' on stdout
        System.out.println(context.getBean("test"));

        //write the second context into it
        FileUtils.writeStringToFile(contextFile, header + contextB);

        //refresh the context
        context.refresh();

        //echo the bean 'test' on stdout
        System.out.println(context.getBean("test"));
    }

}

你得到了这个结果

fromContextA
fromContextB

另一种实现这一目标的方法(也许是一个更简单的方法)是使用Spring 2.5+的Refreshable Bean功能.使用动态语言(groovy等)和spring,你甚至可以改变你的bean行为.看一下动态语言的spring参考:

24.3.1.2.可磨豆

Spring中动态语言支持的一个(如果不是)最引人注目的增值是"可刷新的bean"功能.

可刷新bean是一个动态语言支持的bean,只需少量配置,动态语言支持的bean就可以监视其底层源文件资源的变化,然后在动态语言源文件发生变化时重新加载(对于例如,开发人员编辑并保存对文件系统上文件的更改).



2> Dovmo..:

对于那些最近磕磕绊绊的人来说 - 解决这个问题的当前和现代方法是使用Spring Boot的Cloud Config.

只需添加@RefreshScope注释您刷新豆类和@EnableConfigServer你的主/配置.

所以,例如,这个Controller类:

@RefreshScope
@RestController
class MessageRestController {

    @Value("${message}")
    private String message;

    @RequestMapping("/message")
    String getMessage() {
        return this.message;
    }
}

每当更新配置时,都会message/message端点返回String属性的新值.

有关更多实现详细信息,请参阅官方的Spring Central for Centralized Configuration示例.



3> LiorH..:

我不建议你这样做.对于配置修改的单例bean,你期望发生什么?你期望所有单身人士重新加载吗?但有些对象可能会引用该单例.

请参阅此文章以及Spring中的自动配置重新初始化

推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有