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

时间:2017-11-06 09:58:24

标签: spring events

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

  1. ContextRefreshedEvent
  2. ContextStartedEvent
  3. ContextStoppedEvent
  4. ContextClosedEvent
  5. 哪个事件与servlet上下文事件相关(根据https://docs.oracle.com/javaee/6/api/javax/servlet/ServletContextListener.html):

    • # Semicolon delimiter t['a':5; 'b':7:-7] # Slice within a slice t['a':7:(9:5),] # Two trailing commas t[5,,] # Isolated comma t[,] # Leading comma t[,5] # Empty string t[] # Triple colon t[:::] # Ellipses as part of a slice t[1:...] t[1:2:...] # Ellipses inside no-op parens: t[(...)] # Any non-zero and non-three number of dots: t[.] t[..] t[ . . . . ] ;和
    • ServletContextListener.contextInitialized(ServletContextEvent)

    我有以下情况:

    • 想要尽快初始化日志记录子系统,是否应该在ServletContextListener.contextDestroyed(ServletContextEvent)ContextRefreshedEvent中完成?

    • 我还想尽可能晚地破坏它,如果在ContextStartedEventContextClosedEvent完成?

1 个答案:

答案 0 :(得分:1)

这些内置事件的文档可以在here中找到,尤其是:

  

ContextRefreshedEvent

     

在初始化或刷新ApplicationContext时发布(例如,通过使用ConfigurableApplicationContext接口上的refresh()方法)。在这里,“已初始化”是指所有Bean均已加载,检测到并激活了后处理器Bean,已预先实例化单例并且可以使用ApplicationContext对象。只要尚未关闭上下文,只要选定的ApplicationContext实际上支持这种“热”刷新,就可以多次触发刷新。例如,XmlWebApplicationContext支持热刷新,但GenericApplicationContext不支持。

     

ContextStartedEvent

     

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

     

ContextStoppedEvent

     

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

     

ContextClosedEvent

     

使用ConfigurableApplicationContext接口上的close()方法关闭ApplicationContext时发布。在此,“封闭”表示所有单例豆都被破坏。封闭的情境到了生命的尽头。无法刷新或重新启动。

     

RequestHandledEvent

     

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

Afaik,这些都不与ServletContext直接相关。这与Spring的应用程序上下文所想的是不同的,并且为此存在单独的事件。

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

如果您使用的是Spring Boot,则可能需要查看Spring Boot的 日志系统(org.springframework.boot.logging.LoggingSystem)自己的抽象,它定义了beforeInitializeinitalizecleanUp方法,还有一个shutdownHandler,当JVM存在时会调用

并参见org.springframework.boot.context.logging.LoggingApplicationListener供参考。 Spring Boot随附additional application events。日志记录系统的初始化似乎是在ApplicationEnvironmentPreparedEvent上完成的。在ContextClosedEventApplicationFailedEvent上进行清理。