Spring ApplicationContext를 닫는 방법은 무엇입니까?


85

내 응용 프로그램이 완료되면 스프링 컨텍스트를 닫고 싶습니다.
관련 코드에 ApplicationContext참조가 있지만 close방법을 찾을 수 없습니다 .

답변:


150

당신의 다운 캐스트 ApplicationContext에 ConfigurableApplicationContext있는 정의 close()방법 :

((ConfigurableApplicationContext)appCtx).close();

13
또한 캐스팅 할 수 있습니다AbstractApplicationContext
— eeezyy

3
@eeezyy- AbstractApplicationContext클래스와 마찬가지로 ConfigurableApplicationContext해당 클래스에 의해 구현 된 인터페이스이므로 대부분의 경우 후자를 사용하는 것이 좋습니다.
— Periata Breatta 2016 년

3
마찬가지로 ConfigurableApplicationContext지금 연장 Closable(이 변경에 만들어진 버전을 알고 있지만, 4.2.x를위한 문서는 3.0.x 버전이 있지 않는 것을 동시에 표시되지 않습니다) 훨씬 짧은 버전입니다 ((Closable)context).close();.
— Periata Breatta

6
또한 이제 AutoCloseable구현 AutoCloseable이 있습니다. 즉, 인터페이스가 보이는 변수에 컨텍스트를 저장하는 한 이제 try-with-resources를 사용할 수 있습니다. 즉try (ConfigurableApplicationContext context = new ....) { /* your code goes here */ } // context is closed when you leave the try block
— Periata Breatta

컨텍스트를 어디에서 닫아야합니까? MessageListener 클래스의 onMessage () 메서드를 통해 지속적으로 메시지를받는 리스너 응용 프로그램이 있습니다. 실행기를 마지막으로 종료하려면 어떤 부분에서 응용 프로그램 컨텍스트를 닫아야합니까?
— Wax

36

아래와 같이 JVM에 종료 후크를 등록해야합니다.

((AbstractApplicationContext)appCtx).registerShutdownHook();

자세한 내용은 다음을 참조하십시오. Spring Manual : 3.6.1.6 웹이 아닌 애플리케이션에서 Spring IoC 컨테이너를 정상적으로 종료


이상하게도 이것은 테스트 수업에서는 작동하지 않지만 main () 끝에 Avner Levy의 답변을 사용하면 작동합니다.
— JReader 2015

1
@JReader-종료 후크는 많은 상황에서 신뢰할 수 없으며 대부분의 테스트 프레임 워크 (일반적으로 VM이 테스트 실행 사이에 실제로 종료되지 않기 때문에) 또는 상당수의 애플리케이션 프레임 워크 (예 : 서블릿-가능한 모든 것)에서 실행되지 않습니다. 기본적으로 가상 머신을 종료하지 않고 애플리케이션을 종료하고 다시로드합니다. 당신은 당신의 코드가 사용되는 당신이하고있는 방법을 알고하지 않는 한 당신은 아마를 사용하지 말아야합니다 ..
— Periata Breatta

14

아래와 같이 컨텍스트를 초기화하면

ApplicationContext context = new ClassPathXmlApplicationContext(beansXML); 

이와 같은 깨끗한 컨텍스트

((ClassPathXmlApplicationContext) context).close();

12

Java SE 7 이상인 경우 닫지 말고 try-with-resources를 사용하여 각 리소스가 명령문 끝에서 닫히도록합니다.

try(final AbstractApplicationContext applicationContext = new ClassPathXmlApplicationContext(new String[]{"classpath*:META-INF/spring/*.xml" }))
{
     //write your code
}

1

ApplicationContext개체 를 닫는 단계

  1. Cast the ApplicationContextObject to ConfigurableApplicationContextobject를 입력 합니다.
  2. 그런 다음 닫기 객체를 호출하십시오.

예:

 ApplicationContext context = new ClassPathXmlApplicationContext("mybeans.xml");

((ConfigurableApplicationContext)context ).close();

1
public static void main(String[] args) {
    ApplicationContext context=new ClassPathXmlApplicationContext("SpringCnf.xml");
    Resturant rstro1=(Resturant)context.getBean("resturantBean");
    rstro1.setWelcome("hello user");
    rstro1.welcomeNote();
    ((ClassPathXmlApplicationContext) context).close();

1
이전 게시물에 답변 할 때 다른 사람에게 더 유용 할 수 있으므로 코드뿐 아니라 답변에 컨텍스트를 제공하면 도움이 될 것입니다.
— 데이비드 벅
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.