3.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)
protected void appInitialized() {
log.info("Initialized");
}
// event type is defined by method parameter
@EventListener
protected void appStarted(AppContextStartedEvent event) {
log.info("Started");
}
@EventListener
protected 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"); } }