Как закрыть Spring ApplicationContext?

85

После завершения моего приложения я хочу закрыть весенний контекст.
В соответствующем коде есть ApplicationContextссылка, но мне не удалось найти closeметод.

Авнер Леви
источник

Ответы:

150

Поверженный ваш ApplicationContextк ConfigurableApplicationContextкоторой определяет close()метод:

((ConfigurableApplicationContext)appCtx).close();
Томаш Нуркевич
источник
13
Вы также можете AbstractApplicationContext
транслировать
3
@eeezyy - Поскольку AbstractApplicationContextэто класс и ConfigurableApplicationContextинтерфейс, реализованный этим классом, в большинстве случаев, вероятно, лучше использовать последний.
Periata Breatta
3
Поскольку ConfigurableApplicationContextтеперь расширяется Closable(не знаю, в какой версии было внесено это изменение, но в документации для 4.2.x это показано, а для 3.0.x нет), это гораздо более короткая версия ((Closable)context).close();.
Periata Breatta
6
Также есть AutoCloseableреализация, которая означает, что теперь можно использовать try-with-resources, если вы сохраняете свой контекст в переменной, в AutoCloseableкоторой виден интерфейс, то естьtry (ConfigurableApplicationContext context = new ....) { /* your code goes here */ } // context is closed when you leave the try block
Periata Breatta
Где мне закрыть контекст? У меня есть приложение-слушатель, которое постоянно получает сообщения через метод onMessage () класса MessageListener. В какой части я должен закрыть контекст приложения, чтобы окончательно завершить работу исполнителя?
Wax
36

Вам необходимо зарегистрировать ловушку завершения работы с JVM, как показано ниже:

((AbstractApplicationContext)appCtx).registerShutdownHook();

Для получения дополнительной информации см .: Руководство Spring: 3.6.1.6 Изящное завершение работы контейнера Spring IoC в не веб-приложениях.

кендырь
источник
Как ни странно, у меня это не работает в тестовом классе, но использование ответа Авнера Леви в конце main () действительно работает.
JReader
1
@JReader - перехватчики завершения работы ненадежны во многих случаях и не запускаются большинством тестовых фреймворков (потому что обычно виртуальная машина фактически не завершает работу между запуском тестов) или довольно многих фреймворков приложений. (Например, сервлеты - все, что может завершить и перезагрузить приложение, в основном, не завершая работу виртуальной машины). Вам, вероятно, не стоит их использовать, если вы не знаете, что делаете и как будет использоваться ваш код ..
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. Тип: Приведите ApplicationContextобъект к ConfigurableApplicationContextобъекту.
  2. затем вызовите для этого объект close.

пример:

 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
Отвечая на старый пост, было бы полезно, если бы вы могли предоставить некоторый контекст для своего ответа, а не просто код, так как это может сделать его более полезным для других.
Дэвид Бак