首先分享之前的所有文章 , 欢迎点赞收藏转发三连下次一定 >>>> 😜😜😜
文章合集 : 🎁 juejin.cn/post/694164…
Github : 👉 github.com/black-ant
CASE 备份 : 👉 gitee.com/antblack/ca…
一 .前言
本篇文档来完善 Spring 体系中 Listener 的相关概念 :
主要内容 :
- Listener 的处理流程
- Listener 的同步和异步处理
- 常见的 Listener 处理
二 . Listener 的基础使用
基础使用中包括四个步骤 :
- 构建一个 TranTO 用于承载数据
- 构建一个 Event 用于发布
- 构建一个 Listener 接受事件及处理
- 主业务中发布事件
2.1 数据承载体
数据承载体用于在发布事件的同事携带数据给 Listener
1 | java复制代码public class ListenerTranTO { |
2.2 构建发布 Event
可以看到 , Event 是基于 ApplicationEvent 构建了一个对象
1 | java复制代码 public class DefaultEvent extends ApplicationEvent { |
2.3 构建一个 Listener 接受事件及处理
1 | java复制代码@Component |
2.4 主业务中发布事件
1 | java复制代码 @Autowired |
三 . Listener 流程解析
这部分主要是说明 Listener 在 整个体系中的运用 , 先来看一下常见的几个 Listener , 首先看一下官方对 ApplicationListener 的定义 : 由应用程序事件侦听器实现的接口 , 基于观察者设计模式的标准java.util.EventListener接口。
这里回顾一下 观察者模式 的相关概念 :
观察者模式意图 : 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
参考 @ blog.csdn.net/zzg19950824…
1 | java复制代码public interface Observer { |
3.1 Listener 的触发方式
Listerner的触发主要有以下几种 :
- 容器启动时自动触发
- 手动发布 publishEvent
类型一 : 容器自动触发 , 触发流程
1 | java复制代码C- AbstractApplicationContext # refresh() |
PS:M50_11_02 Listener 的 多播是什么?
Listener 的 多播是什么 ?
将所有事件多播给所有注册的侦听器,让侦听器忽略它们不感兴趣的事件.
监听器通常会对传入的事件对象执行相应的instanceof检查。
同时 , 可以异步处理 , 指定一个替代任务执行器,使侦听器在不同的线程中执行,例如在线程池中执行
总结 : 可以把其当成Listener 的主要发布者
1 | java复制代码 |
3.2 Listener 的循环处理
此处调用 multicastEvent 进行最后的操作 , 主要有几个步骤 :
- resolveDefaultEventType 获得 事件的类型
- getTaskExecutor 获得 Executor -> PS:M50_12_1
- 获得所有的 Listenr
1 | java复制代码// Step 2 : 循环所有的 Listener |
以下通过 eventType 获得 ApplicationListener 类
1 | java复制代码C- AbstractApplicationEventMulticaster |
PS:M50_12_1 : getTaskExecutor 获取 Executor
返回此多播器的当前任务执行器
3.3 Invoke 代理
此处进行实际的调用
1 | java复制代码 |
补充 存放 Listener 的时机
1 | java复制代码 |
四. SpringListener 异步处理
在不开启异步的情况下 , Listener 是非异步的
1 | java复制代码@Configuration |
总结
这文章完善了 Spring 体系中的 Listener 模块 , 总体可以分为2种情况 :
同步情况 : AbstractApplicationContext 中循环所有的 Listener 进行处理
异步情况 : 首先对方法进行代理 ,在调用时 ,通过 Async 配置的线程池中开启一个新线程进行处理
附录
# Listener 的注册方式
转载自 @ www.cnblogs.com/linlf03/p/1…
方式一 : spring.factories 中配置监听器
1 | java复制代码/ |
方式二 : Main 函数中添加 Listener
1 | java复制代码public static void main(String[] args) { |
方式三 : application.propeties 文件中配置
1 | java复制代码 |
方式四 : 相关模块中添加 listener
在部分场景中 , 可以往 Web 容器中通过 AddListener 的方式添加
- JPA 的 @EntityListeners
方式五 : 注解添加
1 | java复制代码@EventListener |
方式五 : WebListener
1 | java复制代码@WebListener |
# WebListener 使用 (与此相同的还有 ServletContextListener )
这里说一下 WebListener 的使用方式 , HttpSessionListener 也是 EventListener 的子接口之一 , 通过实现该 Listener 可以实现对 Session 的操作
1 | java复制代码@WebListener |
更新日志 :
- V20210804 : 补充流程图
本文转载自: 掘金