5.2.8. События жизненного цикла

В приложении на CUBA существуют следующие типы событий жизненного цикла:

AppContextInitializedEvent

Посылается сразу после инициализации AppContext. В этот момент:

  • Полностью инициализированы все бины, в том числе выполнены их методы @PostConstruct.

  • Можно использовать статические методы получения бинов AppBeans.get().

  • Метод AppContext.isStarted() возвращает false.

  • Метод AppContext.isReady() возвращает false.

AppContextStartedEvent

Посылается после AppContextInitializedEvent и после запуска всех AppContext.Listener.applicationStarted(). В этот момент:

  • Метод AppContext.isStarted() возвращает true.

  • Метод AppContext.isReady() возвращает false.

  • В блоке Middleware: если свойство приложения cuba.automaticDatabaseUpdate включено, все скрипты обновления БД успешно выполнены.

AppContextStoppedEvent

Посылается перед остановкой приложения и после запуска всех AppContext.Listener.applicationStopped(). В этот момент:

  • Все бины работоспособны и доступны через статические методы AppBeans.get().

  • Метод AppContext.isStarted() возвращает false.

  • Метод AppContext.isReady() возвращает false.

Порядком исполнения слушателей можно управлять с помощью аннотации @Order. Константы Events.HIGHEST_PLATFORM_PRECEDENCE и Events.LOWEST_PLATFORM_PRECEDENCE определяют диапазон значений, используемый слушателями платформы.

Пример:

package com.company.demo.core;

import com.haulmont.cuba.core.global.Events;
import com.haulmont.cuba.core.sys.events.*;
import org.slf4j.Logger;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;

import javax.inject.Inject;

@Component
public class MyAppLifecycleBean {

    @Inject
    private Logger log;

    // event type is defined by annotation parameter
    @EventListener(AppContextInitializedEvent.class)
    // run after all platform listeners
    @Order(Events.LOWEST_PLATFORM_PRECEDENCE + 100)
    private void appInitialized() {
        log.info("Initialized");
    }

    // event type is defined by method parameter
    @EventListener
    private void appStarted(AppContextStartedEvent event) {
        log.info("Started");
    }

    @EventListener
    private void appStopped(AppContextStoppedEvent event) {
        log.info("Stopped");
    }
}
ServletContextInitializedEvent

Посылается сразу после инициализации контекстов ServletContext и AppContext. В этот момент:

  • Можно использовать статические методы получения бинов AppBeans.get().

  • Событие содержит в себе контексты, позволяющие зарегистрировать собственные сервлеты, фильтры и слушатели, см. раздел Регистрация сервлетов и фильтров.

ServletContextDestroyedEvent

Посылается перед уничтожением контекстов ServletContext и AppContext и позволяет вручную освободить ресурсы.

Пример использования:

@Component
public class MyInitializerBean {

    @Inject
    private Logger log;

    @EventListener
    public void foo(ServletContextInitializedEvent e) {
        log.info("Application and servlet context is initialized");
    }

    @EventListener
    public void bar(ServletContextDestroyedEvent e) {
        log.info("Application is about to shut down, all contexts are now destroyed");
    }
}