[SPRING] 서블릿 컨테이너를 다시 시작하지 않고 Spring 구성 파일을 다시로드 / 새로 고침
SPRING서블릿 컨테이너를 다시 시작하지 않고 Spring 구성 파일을 다시로드 / 새로 고침
내 서블릿 컨테이너를 다시 시작하지 않고 Spring 구성 파일을 새로 고치는 방법은 무엇입니까?
나는 JRebel 이외의 솔루션을 찾고있다.
해결법
-
==============================
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.나는 그렇게하는 것을 권장하지 않습니다. 자신의 구성이 수정 된 싱글 톤 빈에 대해 어떻게 예상됩니까? 모든 싱글 톤이 다시로드되기를 기대합니까? 그러나 일부 객체는 그 싱글 톤에 대한 참조를 보유 할 수 있습니다.
나는 그렇게하는 것을 권장하지 않습니다. 자신의 구성이 수정 된 싱글 톤 빈에 대해 어떻게 예상됩니까? 모든 싱글 톤이 다시로드되기를 기대합니까? 그러나 일부 객체는 그 싱글 톤에 대한 참조를 보유 할 수 있습니다.
이 포스트도 참고하십시오. 스프링의 자동 구성 재 초기화
-
==============================
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.http://www.wuenschenswert.net/wunschdenken/archives/138에서 속성 파일의 내용을 변경하고 저장하면 빈이 새 값으로 다시로드됩니다.
http://www.wuenschenswert.net/wunschdenken/archives/138에서 속성 파일의 내용을 변경하고 저장하면 빈이 새 값으로 다시로드됩니다.
from https://stackoverflow.com/questions/534030/reloading-refreshing-spring-configuration-file-without-restarting-the-servlet-co by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 응답 유형에 적합한 HttpMessageConverter가 없습니다. (0) | 2018.12.24 |
---|---|
[SPRING] Spring @Autowired 및 @Qualifier [닫힘] (0) | 2018.12.24 |
[SPRING] 스프링 테스트에서 @EnableScheduling 사용 안함 (0) | 2018.12.24 |
[SPRING] 스프링 IoC 및 일반 인터페이스 유형 [중복] (0) | 2018.12.24 |
[SPRING] ServletContext 리소스 [/WEB-INF/applicationContext.xml]을 열 수 없습니다. (0) | 2018.12.24 |