Як закрити пружинний ApplicationContext?


83

Після завершення моєї заявки я хочу закрити весняний контекст.
Відповідний код має ApplicationContextпосилання, але я не міг знайти closeметод.

Відповіді:


149

Повалений ваш ApplicationContextдо ConfigurableApplicationContextякої визначає close()метод:

((ConfigurableApplicationContext)appCtx).close();

13
Ви також можете кинути доAbstractApplicationContext
eeezyy

3
@eeezyy - Як AbstractApplicationContextклас, так і ConfigurableApplicationContextінтерфейс, реалізований цим класом, можливо, краще використовувати останній у більшості випадків.
Periata Breatta

3
Оскільки ConfigurableApplicationContextзараз поширюється Closable(не знаю, в якій версії була внесена ця зміна, але документи для 4.2.x показують це, а 3.0.x - ні), набагато коротша версія ((Closable)context).close();.
Periata Breatta

6
Зараз також є AutoCloseableреалізація, що означає, що тепер можна використовувати спробу з ресурсами, якщо ви зберігаєте свій контекст у змінній, де 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

13

Якщо ініціалізувати контекст, як показано нижче

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. потім викличте об'єкт 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
Відповідаючи на стару публікацію, було б корисно, якщо б ви могли надати певний контекст своїй відповіді, а не просто код, оскільки це може зробити її більш корисною для інших.
Девід Бак,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.