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


85

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

답변:


150

당신의 다운 캐스트 ApplicationContextConfigurableApplicationContext있는 정의 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.