Уничтожить созданные bean-компоненты при сбое в ClassPathXmlApplicationContext - PullRequest
0 голосов
/ 18 октября 2019

Я использую SpringPramework ClassPathXMLApplicationContext для инициализации некоторых bean-компонентов следующим образом:

ctx = new ClassPathXMLApplicationContext(filename);

И я вызываю ctx.close() при выходе из приложения.

Однако иногда создание самого ctx дает исключение(из-за ошибки при создании некоторых компонентов), из-за которой я не получаю объект ctx. Но некоторые бины могли успешно инициализироваться до этого исключения.

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

Ответы [ 2 ]

0 голосов
/ 18 октября 2019

Если вы используете Java 7 или более позднюю версию, вы можете объявить инициализацию контекста внутри try с ресурсами, чтобы вам не приходилось закрывать контекст вручную:

try(final AbstractApplicationContext applicationContext = new ClassPathXmlApplicationContext(filename))
{
     //write your code
} catch(Exception e){}

Кроме того, в не-в веб-среде приложения, вы регистрируете ловушку завершения работы с JVM. Это гарантирует плавное завершение работы и вызывает соответствующие методы уничтожения для ваших одноэлементных компонентов, чтобы освободить все ресурсы. Конечно, вы все равно должны правильно настроить и реализовать эти обратные вызовы уничтожения.

Чтобы зарегистрировать обработчик завершения работы, вы вызываете метод registerShutdownHook (), который объявлен в классе AbstractApplicationContext:

public static void main(final String[] args) throws Exception {
  AbstractApplicationContext ctx
      = new ClassPathXmlApplicationContext(new String []{"beans.xml"});

  // add a shutdown hook for the above context... 
  ctx.registerShutdownHook();

  // app runs here...

  // main method exits, hook is called prior to the app shutting down... }

И у веб-реализаций SpringCon ApplicationContext уже есть код, позволяющий корректно завершить работу контейнера Spring IoC во время закрытия соответствующего веб-приложения.

источник: spring-framework-reference

0 голосов
/ 18 октября 2019

Вы можете сконфигурировать ваши bean-компоненты так, чтобы они закрывались контекстом, когда контекст закрывается. Когда вызывается context.close, контекст закрывается / (вызывает метод destroy) на всех bean-компонентах, созданных этим контекстом.

Обычные способы настроить близкие bean-компоненты с XML - это объявить метод destroy, как в:

<bean id=".." destroy-method="close" >..</bean>

или чтобы боб реализовал интерфейс DisposableBean как в:

public class MyBean implements DisposableBean {
  @Override
  public void destroy() throws Exception {
    System.out.println("destroy: called");
  }
}

См. также (официальное) руководство SpringОтключение обратных вызовов

...