深入浅出Spring/SpringBoot 事件监听机制

番茄系统家园 · 2022-03-17 03:46:21

深入浅出Spring/SpringBoot 事件监听机制

说明

事件监听机制可以理解为是一种观察者模式,有数据发布者(事件源)和数据接受者(监听器);

在Java中,事件对象都是继承java.util.EventObject对象,事件监听器都是java.util.EventListener实例;

EventObject对象不提供默认构造器,需要外部传递source参数,即用于记录并跟踪事件的来源;

Spring事件

Spring事件对象为ApplicationEvent,继承EventObject,源码如下:

Spring事件监听器为ApplicationListener,继承EventListener, 源码如下:

实现Spring事件监听有两种方式:

实例:

面向接口编程,实现ApplicationListener接口:

自定义事件对象:

自定义事件监听器:

启动服务并发布事件:

运行结果:

使用注解 @EventListener实现Spring事件监听:

启动并发布事件:

运行结果:

通过实例可以看出,上面两种方式都可正常发布和接收事件。

实现原理

通过上面实例可以看出,context 可以发布事件,那底层是怎么发布的,让我们继续看源码:

通过源码我们可以看出,事件应该是通过

ApplicationEventMulticaster发布的,我们继续看:

Spring 中事件发布都是通过

SimpleApplicationEventMulticaster来实现的

可以看出,如果设置了Executor则异步发送,否则同步;而且可以看出通过resolveDefaultEventType(event)对发布的事件类型进行了校验,这就是为什么我们可以直接使用泛型来指定我们想接收的事件对象,比如上面的 ApplicationListener。

最后就使用对应的ApplicationListener进行接收和处理就行了,那么ApplicationListener是什么时候注册的呢?

如何添加ApplicationListener?

第三种实现的源码如下(

EventListenerMethodProcessor中):

Spring内建事件

  • ContextRefreshedEvent: Spring应用上下文就绪事件;
  • ContextStartedEvent: Spring应用上下文启动事件;
  • ContextStopedEvent: Spring应用上下文停止事件;
  • ContextClosedEvent: Spring应用上下文关闭事件;

Spring Boot事件

Spring Boot事件是在Spring事件基础上进行的封装

事件对象改为SpringApplicationEvent,事件源为SpringApplication(Spring事件源为Context);

底层发布事件还是使用

SimpleApplicationEventMulticaster 对象,不过有点需要说明的是,SpringBoot1.4开始,SpringApplication和ApplicationContext使用的都是

SimpleApplicationEventMulticaster实例,但是两者属于不同的对象(1.0 ~ 1.3版本是同一个对象);

事件回顾:

运行结果:

从结果可以看出,事件对象类型和事件源,以及事件发布顺序。

免责声明: 凡标注转载/编译字样内容并非本站原创,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如果你觉得本文好,欢迎推荐给朋友阅读;本文链接: https://m.nndssk.com/dngz/333674C3TSlp.html
猜你喜欢
最新应用
热门应用