Spring应用上下文事件
转自:https://www.baeldung.com/spring-context-events
1.简介
在本教程中,我们将学习Spring框架提供的事件机制。我们将探索框架提供的各种内置事件,然后查看如何使用它。
Spring具有围绕ApplicationContext
构建的事件机制。它可用于在不同bean之间交换信息。我们可以通过监听事件并执行自定义代码来利用应用事件。
例如,这里的场景是在ApplicationContext
完全启动时执行自定义逻辑。
2.标准上下文事件
实际上,Spring中有许多内置事件,使开发人员可以在应用和上下文的生命周期嵌入一些自定义操作。
即使我们很少在应用中手动使用这些事件,框架会在其内部大量使用它。让我们从探索Spring的各种内置事件开始。
2.1. ContextRefreshedEvent
在初始化或刷新ApplicationContext
时,Spring会发ContextRefreshedEvent
。通常,只要尚未关闭上下文,刷新就可以多次触发。
请注意,我们还可以通过在ConfigurableApplicationContext
接口上调用refresh()
方法来手动触发事件。
2.2. ContextStartedEvent
通过在ConfigurableApplicationContext
上调用start()
方法,我们触发此事件并启动ApplicationContext
。实际上,该方法通常用于在显式停止后重新启动Bean。我们还可以使用该方法来处理没有配置自动启动的组件。
在这里,重要注意的是,对start()
的调用始终是显式的,与refresh()
相反。
2.3. ContextStoppedEvent
通过调用ConfigurableApplicationContext
上的stop()
方法,可以**在停止ApplicationContext
时发布ContextStoppedEvent
**。如前所述,我们可以使用start()
方法重新启动已停止的事件。
2.4. ContextClosedEvent
当使用ConfigurableApplicationContext
中的close()
方法关闭ApplicationContext
时,将发布此事件。
实际上,关闭上下文后,我们无法重新启动它。
上下文在关闭时就已经寿终正寝,因此我们无法像在ContextStoppedEvent
中那样重新启动它。
3. @EventListener
接下来,让我们探索如何消费已发布的事件。从4.2版本开始,Spring支持注释驱动的事件监听器– @EventListener
。
具体是,我们可以利用此注解根据方法的签名自动注册ApplicationListener
:
1 |
|
重要的是,@EventListener
是核心注解,因此不需要任何额外的配置。 实际上,现有的<context:annotation-driven />
元素为其提供了全面的支持。
用@EventListener
注解的方法可以返回非空类型。 如果返回的值非空,则事件机制将为其发布新事件。
3.1. 聆听多个事件
现在,可能会出现这样的情况,我们将需要监听器消费多个事件。
对于这种情况,我们可以利用classes
属性:
1 |
|
4.应用程序事件监听器
如果使用的是Spring的早期版本(<4.2),则必须引入自定义的ApplicationEventListener
并重写onApplicationEvent
方法以监听事件。
5.结论
在本文中,我们探讨了Spring中的各种内置事件。 此外,我们已经看到了多种监听已发布事件的方法。
与往常一样,可以在Github上找到本文中使用的代码段:地址。