복붙노트

[SPRING] 서블릿 컨테이너를 다시 시작하지 않고 Spring 구성 파일을 다시로드 / 새로 고침

SPRING

서블릿 컨테이너를 다시 시작하지 않고 Spring 구성 파일을 다시로드 / 새로 고침

내 서블릿 컨테이너를 다시 시작하지 않고 Spring 구성 파일을 새로 고치는 방법은 무엇입니까?

나는 JRebel 이외의 솔루션을 찾고있다.

해결법

  1. ==============================

    1.응용 프로그램을 테스트하는 동안 컨텍스트를 다시로드하는 것이 유용 할 수 있습니다.

    응용 프로그램을 테스트하는 동안 컨텍스트를 다시로드하는 것이 유용 할 수 있습니다.

    AbstractRefreshableApplicationContext 클래스 중 하나의 새로 고침 메서드를 사용해 볼 수 있습니다. 이전에 인스턴스화 된 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 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
            "<!DOCTYPE beans PUBLIC \"-//SPRING//DTD BEAN//EN\"\n" +
            " \t\"http://www.springframework.org/dtd/spring-beans.dtd\">\n";
    
        final static String contextA =
            "<beans><bean id=\"test\" class=\"java.lang.String\">\n" +
                "\t\t<constructor-arg value=\"fromContextA\"/>\n" +
            "</bean></beans>";
    
        final static String contextB =
            "<beans><bean id=\"test\" class=\"java.lang.String\">\n" +
                "\t\t<constructor-arg value=\"fromContextB\"/>\n" +
            "</bean></beans>";
    
        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 기능을 사용하는 것입니다. 동적 인 언어 (그루비 등)와 봄을 사용하면 콩 동작을 변경할 수도 있습니다. 동적 언어에 대한 스프링 참조를 살펴보십시오.

  2. ==============================

    2.나는 그렇게하는 것을 권장하지 않습니다. 자신의 구성이 수정 된 싱글 톤 빈에 대해 어떻게 예상됩니까? 모든 싱글 톤이 다시로드되기를 기대합니까? 그러나 일부 객체는 그 싱글 톤에 대한 참조를 보유 할 수 있습니다.

    나는 그렇게하는 것을 권장하지 않습니다. 자신의 구성이 수정 된 싱글 톤 빈에 대해 어떻게 예상됩니까? 모든 싱글 톤이 다시로드되기를 기대합니까? 그러나 일부 객체는 그 싱글 톤에 대한 참조를 보유 할 수 있습니다.

    이 포스트도 참고하십시오. 스프링의 자동 구성 재 초기화

  3. ==============================

    3.최근에이 문제를 해결 한 현재와 현대적인 방법은 Spring Boot의 Cloud Config를 사용하는 것입니다.

    최근에이 문제를 해결 한 현재와 현대적인 방법은 Spring Boot의 Cloud Config를 사용하는 것입니다.

    새로 고침 가능한 빈에 @RefreshScope 주석을 추가하고 기본 / 구성에 @EnableConfigServer를 추가하십시오.

    예를 들어,이 Controller 클래스는 다음과 같습니다.

    @RefreshScope
    @RestController
    class MessageRestController {
    
        @Value("${message}")
        private String message;
    
        @RequestMapping("/message")
        String getMessage() {
            return this.message;
        }
    }
    

    구성이 업데이트 될 때마다 / message 끝점에 대한 메시지 String 속성의 새 값을 반환합니다.

    자세한 구현 세부 사항은 중앙 집중식 구성을위한 공식 Spring 가이드를 참조하십시오.

  4. ==============================

    4.http://www.wuenschenswert.net/wunschdenken/archives/138에서 속성 파일의 내용을 변경하고 저장하면 빈이 새 값으로 다시로드됩니다.

    http://www.wuenschenswert.net/wunschdenken/archives/138에서 속성 파일의 내용을 변경하고 저장하면 빈이 새 값으로 다시로드됩니다.

  5. from https://stackoverflow.com/questions/534030/reloading-refreshing-spring-configuration-file-without-restarting-the-servlet-co by cc-by-sa and MIT license