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
2
3
4
@EventListener
public void handleContextRefreshEvent(ContextStartedEvent ctxStartEvt) {
System.out.println("Context Start Event received.");
}

重要的是,@EventListener是核心注解,因此不需要任何额外的配置。 实际上,现有的<context:annotation-driven />元素为其提供了全面的支持。

@EventListener注解的方法可以返回非空类型。 如果返回的值非空,则事件机制将为其发布新事件。

3.1. 聆听多个事件

现在,可能会出现这样的情况,我们将需要监听器消费多个事件。

对于这种情况,我们可以利用classes属性:

1
2
3
4
@EventListener(classes = { ContextStartedEvent.class, ContextStoppedEvent.class })
public void handleMultipleEvents() {
System.out.println("Multi-event listener invoked");
}

4.应用程序事件监听器

如果使用的是Spring的早期版本(<4.2),则必须引入自定义的ApplicationEventListener并重写onApplicationEvent方法以监听事件。

5.结论

在本文中,我们探讨了Spring中的各种内置事件。 此外,我们已经看到了多种监听已发布事件的方法。

与往常一样,可以在Github上找到本文中使用的代码段:地址