在Spring 5.x中,以下事件有什么区别?
哪个事件与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
中完成?
我还想尽可能晚地破坏它,如果在ContextStartedEvent
或ContextClosedEvent
完成?
答案 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的应用程序上下文所想的是不同的,并且为此存在单独的事件。
设置和拆除日志系统可能很复杂,并且取决于您使用的日志系统。但简而言之,您可能要尝试使用ContextRefreshedEvent
和ContextClosedEvent
。其他两个仅在您在应用程序上下文中调用start()
或stop()
时分派,因此您不想使用它们。
如果您使用的是Spring Boot,则可能需要查看Spring Boot的
日志系统(org.springframework.boot.logging.LoggingSystem
)自己的抽象,它定义了beforeInitialize
,initalize
和cleanUp
方法,还有一个shutdownHandler
,当JVM存在时会调用
并参见org.springframework.boot.context.logging.LoggingApplicationListener
供参考。 Spring Boot随附additional application events。日志记录系统的初始化似乎是在ApplicationEnvironmentPreparedEvent
上完成的。在ContextClosedEvent
和ApplicationFailedEvent
上进行清理。