Spring - 事件监听机制

news/2024/11/19 23:28:19/文章来源:https://www.cnblogs.com/hld123/p/18347018

Spring - 事件监听机制

 

  Spring 事件驱动模型也是观察者模式很经典的应用。就是我们常见的项目中最常见的事件监听器。

  一、Spring 中观察者模式的四个角色

  1.  事件 - ApplicationEvent

  ApplicationEvent 是所有事件对象的父类。ApplicationEvent 继承自 jdk 的 EventObject, 所有的事件都需要继承 ApplicationEvent, 并且通过 source 得到事件源。

  Spring 也为我们提供了很多内置事件,ContextRefreshedEvent、ContextStartedEvent、ContextStoppedEvent、ContextClosedEvent。

  如下图:

   2. 事件监听 - ApplicationListener

   ApplicationListener,也就是观察者,继承自 jdk 的 EventListener,该类中只有一个方法 onApplicationEvent。当监听的事件发生后该方法会被执行。

   3. 事件源 - ApplicationContext

   ApplicationContext 是 Spring 中的核心容器,在事件监听中 ApplicationContext 可以作为事件的发布者,也就是事件源。因为 ApplicationContext 继承自 ApplicationEventPublisher。

   在 ApplicationEventPublisher 中定义了事件发布的方法:publishEvent(Object event)

   4. 事件管理 - ApplicationEventMulticaster

   用于事件监听器的注册和事件的广播。监听器的注册就是通过它来实现的,它的作用是把 Applicationcontext 发布的 Event 广播给它的监听器列表。

   代码示例:

   定义事件:

  二、显示遍历观察者的问题

  在 Spring Framework 和 Spring Boot 的事件监听机制中,事件的发布和监听机制通常并不直接涉及到在主题对象中显式地遍历观察者(或监听器)。相反,它们利用了 Spring 的应用上下文(ApplicationContext)和事件发布机制来管理事件的发送和监听。

  SimpleApplicationEventMulticaster

  Spring 使用 SimpleApplicationEventMulticaster 作为事件广播器,它会负责将事件分发给所有注册的监听器

  SimpleApplicationEventMulticaster 部分代码如下:

 1 public class SimpleApplicationEventMulticaster extends AbstractApplicationEventMulticaster {
 2 
 3    //...
 4 
 5     @Override
 6     public void multicastEvent(ApplicationEvent event) {
 7         multicastEvent(event, resolveDefaultEventType(event));
 8     }
 9 
10     @Override
11     public void multicastEvent(final ApplicationEvent event, @Nullable ResolvableType eventType) {
12         ResolvableType type = (eventType != null ? eventType : resolveDefaultEventType(event));
13         Executor executor = getTaskExecutor();
14         for (ApplicationListener<?> listener : getApplicationListeners(event, type)) {
15             if (executor != null) {
16                 executor.execute(() -> invokeListener(listener, event));
17             }
18             else {
19                 invokeListener(listener, event);
20             }
21         }
22     }
23 }
invokeListener中最终执行的是listener.onApplicationEvent(event);其实也就是执行ApplicationListener实现类的onApplicationEvent方法,里面的内容是监听器在事件发生时执行的特定逻辑

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/779253.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高并发设计技术方案

高并发设计技术方案 一、负载均衡对于一些大型系统,一般会采用 DNS+四层负载+七层负载的方式进行多层次负载均衡算法:随机算法、轮询算法、轮询权重算法、一致性哈希算法、最小连接、自适应算法。负载均衡工具:LVS、Nginx、HAProxy二、分布式微服务常用微服务框架有:Spring…

【运维自动化-配置平台】如何使用云资源同步功能(腾讯云为例)

云资源同步是通过apikey去单向同步云上的主机资源和云区域信息,目前支持腾讯云和亚马逊云。主要特性 1、蓝鲸配置平台周期性的单向只读同步云主机和vpc(对应蓝鲸云区域)信息,第一次全量,后面增量 2、默认同步到主机池,也可自定义主机池模块,需要手动分配到业务 3、主机随…

Day22 第七章 回溯算法part01

77. 组合 216. 组合总和 III 17. 电话号码的字母组合任务 77. 组合 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 思路 组合思路 对于组合问题,是在一个集合中取不同的数,构成各种组合,本质上是一个多叉树的路径问题,即递归序遍历多叉树并收集信息,并…

有了Power BI还需要深入学习Excel图表制作吗?

Power BI和Excel都是微软公司的产品,但它们在数据分析和可视化方面有着不同的定位和功能。 Power BI是一个强大的商业分析工具,它提供了数据集成、数据建模、报告和仪表板的创建等功能。Power BI 特别适合处理大量数据,并且可以连接到多种数据源。它还支持高级的数据分析技术…

CSS3第一天(基础选择器+复合选择器)

1.选择器 基础选择器:标签选择器(某一类标签)、类选择器(一个或几个标签,最常用)、id选择器和通配符选择器标签名{属性1:属性值1;属性2:属性值2;...} 类选择器(可以多个标签使用) .类名{属性1:属性值1;...}<ul><li class="red">大雨</li…

代码随想录day22 || 77 组合,216 组合总和,17 电话号码字母组合

回溯问题回溯通常用来解决这些问题 组合问题:N个数里面按一定规则找出k个数的集合 切割问题:一个字符串按一定规则有几种切割方式 子集问题:一个N个数的集合里有多少符合条件的子集 排列问题:N个数按一定规则全排列,有几种排列方式 棋盘问题:N皇后,解数独等等回溯的通用…

freemarker实现动态行单元格合并

原文链接:https://www.cnblogs.com/10158wsj/p/11211471.html https://blog.csdn.net/weixin_43667830/article/details/106936546 项目需求:项目中有个需求,需要将一些数据库中的数据根据需求导出,生成一个word,研究了一些技术,其中包括POI、freemaker,对比了一下实现过…

Xbox Game Pass Ultimate one dollar Trial All In One

Xbox Game Pass Ultimate one dollar Trial All In One XGPU $1 美元试用 Xbox Game Pass Ultimate — 14 Day Trial Recurs MonthlyXbox Game Pass Ultimate one dollar Trial All In OneXGPU $1 美元试用Xbox Game Pass Ultimate — 14 Day Trial Recurs Monthly Xbox Game P…

代码静态测试工具 Helix QAC 2024.1版新功能解读

Helix QAC 2024.1改进了对C++20和C23语言特性的支持,并增加了分析使用多个编译器的项目的新功能。此外,Validate增强了对于搜索功能和角色权限的用户体验,并且包括一个新的问题列表的CSV下载选项。此版本还包括对于C/C++的CWE、C的HKMC和MISRA C++:2023合规模块的扩展执行,…

苹果与英伟达公开分手,谷歌 TPU 芯片成为苹果 AI 训练新利器

苹果公司发布论文公开其 AI 模型的训练细节,放弃英伟达GPU而转向选择谷歌TPU芯片。科技巨头们在尖端 AI 训练方面开始寻求更多元化的算力硬件解决方案。北京时间 7 月 30 日,苹果公司发布了一篇研究论文,论文显示苹果公司使用了谷歌开发的 TPU 芯片而非英伟达的 GPU 芯片来训…

三色法GC总结

作用:因并发标记过程中,程序还在跑。对象间的引用会发生变化,可能会导致漏标或错标情况。因此采用三色法,将扫描的各情况用颜色区别出来。 三种颜色 白色:一开始所有对象的颜色都是白色,即未扫描过的对象。 灰色:表示对象已经扫描到了,但是对象所在的引用对象,还未全部…