ContextRefreshedEvent,ContextStartedEvent,ContextStoppedEvent和ContextClosedEvent有什么区别

Fra*_*hey 8 events spring

在Spring 5.x中,以下事件之间有什么区别?

  1. ContextRefreshedEvent
  2. ContextStartedEvent
  3. ContextStoppedEvent
  4. ContextClosedEvent

哪个事件与servlet上下文事件相关(根据https://docs.oracle.com/javaee/6/api/javax/servlet/ServletContextListener.html):

  • ServletContextListener.contextInitialized(ServletContextEvent); 和
  • ServletContextListener.contextDestroyed(ServletContextEvent)

我有以下情况:

  • 想要尽快初始化日志记录子系统,是否应该在ContextRefreshedEventContextStartedEvent

  • 我也想尽可能晚地破坏它,如果这样做ContextClosedEvent或者ContextStoppedEvent

Dar*_*idl 10

这些内置事件的文档可以在这里找到,特别是:

上下文刷新事件

在 ApplicationContext 初始化或刷新时发布(例如,通过使用 ConfigurableApplicationContext 接口上的 refresh() 方法)。在这里,“初始化”意味着所有 bean 都被加载,后处理器 bean 被检测并激活,单例被预实例化,ApplicationContext 对象准备好使用。只要上下文尚未关闭,就可以多次触发刷新,前提是所选的 ApplicationContext 实际上支持这种“热”刷新。例如,XmlWebApplicationContext 支持热刷新,但 GenericApplicationContext 不支持。

上下文启动事件

使用 ConfigurableApplicationContext 接口上的 start() 方法启动 ApplicationContext 时发布。这里,“已启动”意味着所有 Lifecycle bean 都收到一个明确的启动信号。通常,此信号用于在显式停止后重新启动 bean,但它也可用于启动尚未配置为自动启动的组件(例如,尚未在初始化时启动的组件)。

上下文停止事件

在通过使用 ConfigurableApplicationContext 接口上的 stop() 方法停止 ApplicationContext 时发布。这里,“已停止”意味着所有生命周期 bean 都收到一个明确的停止信号。停止的上下文可以通过 start() 调用重新启动。

上下文关闭事件

使用 ConfigurableApplicationContext 接口上的 close() 方法关闭 ApplicationContext 时发布。在这里,“关闭”意味着所有单例 bean 都被销毁。一个封闭的上下文到达其生命的尽头。它无法刷新或重新启动。

请求处理事件

一个特定于 Web 的事件,告诉所有 bean 已为 HTTP 请求提供服务。此事件在请求完成后发布。此事件仅适用于使用 Spring 的 DispatcherServlet 的 Web 应用程序。

Afaik,这些都与 ServletContext 没有直接关系。这与 Spring 的应用程序上下文不同,并且有单独的事件。

设置和拆除日志系统可能很复杂,这取决于您使用的日志系统。简而言之,您可能想尝试使用ContextRefreshedEventand ContextClosedEvent。其他两个仅在您调用start()stop()应用程序上下文时分派,因此您不想使用它们。

如果你使用Spring的引导,你可能想看看Spring引导自己的日志记录系统(抽象org.springframework.boot.logging.LoggingSystem),它定义beforeInitializeinitalizecleanUp方法,也是shutdownHandler当JVM存在被调用。

并参阅org.springframework.boot.context.logging.LoggingApplicationListener以供参考。Spring Boot 带有额外的应用程序事件。日志系统的初始化似乎是在ApplicationEnvironmentPreparedEvent. 清理是在ContextClosedEvent和上完成的ApplicationFailedEvent