3.2.8. 应用程序生命周期事件

CUBA 应用程序中有以下几种类型的生命周期事件

AppContextInitializedEvent

AppContext初始化后立即触发。 此时:

  • 所有bean都已完全初始化,并且执行了 @PostConstruct 方法。

  • 可通过静态方法 AppBeans.get() 获取 bean。

  • AppContext.isStarted() 方法返回 false

  • AppContext.isReady() 方法返回 false

AppContextStartedEvent

AppContextInitializedEvent 之后并且运行完所有 AppContext.Listener.applicationStarted() 之后触发。此时:

  • AppContext.isStarted() 方法返回 true

  • AppContext.isReady() 方法返回 false

  • 在中间件上,如果启用了 cuba.automaticDatabaseUpdate应用程序属性,所有数据库更新脚本已成功执行。

AppContextStoppedEvent

在应用程序关闭之前并且运行完所有 AppContext.Listener.applicationStopped() 之后触发。此时:

  • 所有 bean 都可以运行并且可以通过 AppBeans.get() 方法获得。

  • AppContext.isStarted() 方法返回 false

  • AppContext.isReady() 方法返回 false

通过指定 @Order 注解可以影响监听器调用的顺序。Events.HIGHEST_PLATFORM_PRECEDENCEEvents.LOWEST_PLATFORM_PRECEDENCE 常量指定平台中定义的监听器的使用范围。

例如:

  1. package com.company.demo.core;
  2. import com.haulmont.cuba.core.global.Events;
  3. import com.haulmont.cuba.core.sys.events.*;
  4. import org.slf4j.Logger;
  5. import org.springframework.context.event.EventListener;
  6. import org.springframework.stereotype.Component;
  7. import javax.inject.Inject;
  8. @Component
  9. public class MyAppLifecycleBean {
  10. @Inject
  11. private Logger log;
  12. // event type is defined by annotation parameter
  13. @EventListener(AppContextInitializedEvent.class)
  14. // run after all platform listeners
  15. @Order(Events.LOWEST_PLATFORM_PRECEDENCE + 100)
  16. protected void appInitialized() {
  17. log.info("Initialized");
  18. }
  19. // event type is defined by method parameter
  20. @EventListener
  21. protected void appStarted(AppContextStartedEvent event) {
  22. log.info("Started");
  23. }
  24. @EventListener
  25. protected void appStopped(AppContextStoppedEvent event) {
  26. log.info("Stopped");
  27. }
  28. }

ServletContextInitializedEvent

在 servlet 和应用程序上下文初始化之后触发。此时:

  • 可以通过静态方法 AppBeans.get() 获取 bean。

  • 此事件包含应用程序和 servlet 上下文,因此可以注册自定义 servlet、过滤器和监听器,请参阅Servlet 和过滤器的注册

ServletContextDestroyedEvent

在 Servlet 和应用程序即将关闭时触发,在这个阶段可以手动释放资源。

例如:

  1. @Component
  2. public class MyInitializerBean {
  3. @Inject
  4. private Logger log;
  5. @EventListener
  6. public void foo(ServletContextInitializedEvent e) {
  7. log.info("Application and servlet context is initialized");
  8. }
  9. @EventListener
  10. public void bar(ServletContextDestroyedEvent e) {
  11. log.info("Application is about to shut down, all contexts are now destroyed");
  12. }
  13. }