Как правильно закрыть ApplicationContext весной?

Я учусь на сертификацию Spring Core, и у меня есть некоторые сведения по этому вопросу, найденные в предоставленном учебном материале:

каков предпочтительный способ закрыть контекст приложения?

Я знаю, что если у меня что-то вроде этого:

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

С помощью закрыть() метод контекст objet ApplicationContext закрыт, и приложение разрушенный.

но я думаю, что это не лучший способ, которым я должен это сделать.

читая официальную документацию, я нахожу, что я также могу сделать что-то вроде этого:

context.registerShutdownHook();

это зарегистрируйте крюк выключения с помощью JVM таким образом, это JVM, который вызовет фазу закрытия Spring до выхода JVM. Таким образом, на выходе JVM завершится фаза закрытия весны.

по документации я могу прочитать, что: обычно невозможно позвонить context.close() потому что многие приложения (веб-приложения) работают бесконечно, но что именно означает это последнее утверждение? почему веб-приложение работает бесконечно?

Итак, мои вопросы:

  • могу ли я использовать этот второй способ для закрытия контекста приложения также с не веб-приложением?
  • предпочтительнее уважать context.close()?

Tnx

2 ответов


как вы знаете, что ContextLoaderListener это тот, который заботится о инициализации и разрушения ваших ApplicationContext, при завершении работы сервера, что ContextLoaderListener это contextDestroyed метод вызывается.

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

в этой closeWebApplicationContext, они на самом деле называют close метод на ApplicationContext, как это

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

это прямо из spring-web-4.1.5.jar. Как видно отсюда, они используют close чтобы уничтожить ApplicationContext в интернете приложения.

но registerShutdownHook используется для явного закрытия контейнера IoC в не-веб-приложениях, таких как автономное настольное приложение, особенно при создании ApplicationContext вручную из ClassPathXmlApplicationContext (или) FileSystemXmlApplicationContext (или) некоторых других типов.

это делается для освобождения всех ресурсов, используемых приложением spring, и вызова метода destroy на ваших весенних бобах, если таковые имеются.


в документации я могу прочитать это: обычно невозможно вызвать контекст.close () потому что многие приложения (веб-приложения) работают бесконечно, но что именно означает это последнее утверждение? почему веб-приложение работает бесконечно?

веб-приложение будет работать до тех пор, пока сервер приложений, который его развертывает. Это зависит от сервера приложений (а не от вас), чтобы правильно запустить и остановить приложение. Это означает, что когда сервер приложений остановлен, контекст сервлета уничтожен. В весеннем приложении ContextLoaderListener зарегистрированную в web.xml прослушивает это событие (контекст уничтожен), чтобы правильно закрыть контекст Spring.

при использовании Spring вне сервера приложений (например, автономного приложения), это зависит от вас, чтобы правильно остановить контекст Spring. Как вы сказали, Это можно сделать, явно вызвав context.close() или регистрация крючка выключения (context.registerShutdownHook()), что делает этот призыв вы.