Reloading/Refreshing Spring configuration file without restarting the servlet container

后端 未结 4 1140
轮回少年
轮回少年 2020-11-30 04:43

How can I refresh Spring configuration file without restarting my servlet container?

I am looking for a solution other than JRebel.

4条回答
  •  迷失自我
    2020-11-30 05:15

    Well, it can be useful to perform such a context reload while testing your app.

    You can try the refresh method of one of the AbstractRefreshableApplicationContext class: it won't refresh your previously instanciated beans, but next call on the context will return refreshed beans.

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

    And you get this result

    fromContextA
    fromContextB
    

    Another way to achieve this (and maybe a more simple one) is to use the Refreshable Bean feature of Spring 2.5+ With dynamic language (groovy, etc) and spring you can even change your bean behavior. Have a look to the spring reference for dynamic language:

    24.3.1.2. Refreshable beans

    One of the (if not the) most compelling value adds of the dynamic language support in Spring is the 'refreshable bean' feature.

    A refreshable bean is a dynamic-language-backed bean that with a small amount of configuration, a dynamic-language-backed bean can monitor changes in its underlying source file resource, and then reload itself when the dynamic language source file is changed (for example when a developer edits and saves changes to the file on the filesystem).

提交回复
热议问题