복붙노트

[SPRING] Spring에서 ApplicationContext를 정확히 닫는 방법은 무엇입니까?

SPRING

Spring에서 ApplicationContext를 정확히 닫는 방법은 무엇입니까?

저는 Spring 핵심 자격증을 받기 위해 공부하고 있는데, 제공된 질문 자료로 자금을 충원 한이 질문에 대해서는 의심의 여지가 있습니다.

나는 내가 이와 같은 것을 가지고 있다면 그것을 안다.

ConfigurableApplicationContext context = …
// Destroy the application
context.close();

컨텍스트 객체에 대해 close () 메소드를 사용하면 ApplicationContext가 닫히고 응용 프로그램이 파괴됩니다.

그러나 나는 이것이 내가해야만하는 최선의 방법이 아니라고 생각한다.

공식 문서 읽기 나는 또한 다음과 같은 것을 할 수 있음을 알았다.

context.registerShutdownHook();

JVM과 종료 훅을 등록하므로 JVM이 종료되기 전에 Spring의 닫기 단계를 트리거하는 JVM이됩니다. 따라서 JVM 종료시 Spring의 종료 단계가 실행됩니다.

문서에서 나는 그것을 읽을 수있다 : 보통 많은 애플리케이션 (웹 애플리케이션)이 무한히 실행되기 때문에 context.close ()를 호출 할 수 없다. 그러나이 마지막 어설 션을 정확하게 의미하는 것은 무엇인가? 웹 응용 프로그램이 무기한으로 실행되는 이유는 무엇입니까?

그래서 내 질문은 :

Txx

해결법

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

    1.ContextLoaderListener가 ApplicationContext를 초기화하고 파기하는 일을 처리한다는 것을 알고 있기 때문에 서버를 종료 할 때 해당 ContextLoaderListener의 contextDestroyed 메서드가 호출됩니다.

    ContextLoaderListener가 ApplicationContext를 초기화하고 파기하는 일을 처리한다는 것을 알고 있기 때문에 서버를 종료 할 때 해당 ContextLoaderListener의 contextDestroyed 메서드가 호출됩니다.

      public void contextDestroyed(ServletContextEvent event){
        closeWebApplicationContext(event.getServletContext());
        ContextCleanupListener.cleanupAttributes(event.getServletContext());
      }
    

    closeWebApplicationContext에서, 이들은 실제로 아래와 같이 ApplicationContext에서 close 메소드를 호출합니다.

      if ((this.context instanceof ConfigurableWebApplicationContext)) {
        ((ConfigurableWebApplicationContext)this.context).close();
      }
    

    이것은 spring-web-4.1.5.jar에서 바로 볼 수 있습니다. 여기에서 알 수 있듯이 웹 애플리케이션에서 ApplicationContext를 파괴하기 위해 가까이 사용합니다.

    그러나 registerShutdownHook은 웹 응용 프로그램이 아닌 다른 응용 프로그램에서 IoC 컨테이너를 명시 적으로 종료하는 데 사용됩니다. 특히 ClassPathXmlApplicationContext (또는) FileSystemXmlApplicationContext (또는) 일부 유형에서 ApplicationContext를 수동으로 만들 때 독립형 데스크톱 응용 프로그램과 유사합니다.

    스프링 애플리케이션에서 사용하는 모든 리소스를 해제하고 스프링 빈에서 destroy 메소드를 호출하기 위해 수행됩니다.

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

    2.웹 응용 프로그램을 배포하는 응용 프로그램 서버가 실행되는 한 웹 응용 프로그램이 실행됩니다. 응용 프로그램을 올바르게 시작하고 중지하는 것은 응용 프로그램 서버 (귀하가 아닌)의 책임입니다. 즉, 응용 프로그램 서버가 중지되면 서블릿 컨텍스트가 파손됩니다. Spring 애플리케이션에서 web.xml에 등록 된 ContextLoaderListener 클래스는 Spring 컨텍스트를 제대로 닫으려면이 이벤트 (컨텍스트가 삭제됨)를 수신 대기합니다.

    웹 응용 프로그램을 배포하는 응용 프로그램 서버가 실행되는 한 웹 응용 프로그램이 실행됩니다. 응용 프로그램을 올바르게 시작하고 중지하는 것은 응용 프로그램 서버 (귀하가 아닌)의 책임입니다. 즉, 응용 프로그램 서버가 중지되면 서블릿 컨텍스트가 파손됩니다. Spring 애플리케이션에서 web.xml에 등록 된 ContextLoaderListener 클래스는 Spring 컨텍스트를 제대로 닫으려면이 이벤트 (컨텍스트가 삭제됨)를 수신 대기합니다.

    응용 프로그램 서버 (예 : 독립 실행 형 응용 프로그램) 외부에서 Spring을 사용하는 경우 Spring 컨텍스트를 올바르게 중지해야합니다. 앞에서 말한 것처럼 명시 적으로 context.close ()를 호출하거나이 호출을하는 종료 훅 (context.registerShutdownHook ())을 등록하여이 작업을 수행 할 수 있습니다.

  3. from https://stackoverflow.com/questions/29169916/how-correctly-close-the-applicationcontext-in-spring by cc-by-sa and MIT license