Spring中ApplicationListener事件监听机制详解

2023-10-30

1.​概述

Spring中事件监听(也有说法叫事件通知)机制,其实本质是观察者模式的应用。当某个事件发生时,其会被广播出去,监听该实践的listener就会被触发然后执行响应的动作。该模式可良好应用于程序解耦,类似消息的发布订阅   它的事件监听机制基于ApplicationListener这个接口 

由以上源码可以看出这个接口继承了java.util.EventListener 基于观察者模式  ApplicationListener的实现类会在spring容器启动的时候被发现

2.三种模式(事件、监听、发布)

2.1 事件

如下图所示,事件继承自EventObject类,该类维护了事件最初发生在其上的对象-source。而我们通常自定义的事件实际应继承自抽象类ApplicationEvent。比如常见的上下文刷新事件ContextRefreshedEvent

先定义一个事件类User

2.2 监听

自定义监听有两种实现方式:继承自ApplicationListener或者使用注解@EventListener

2.3 发布

有了事件与监听 ,那么还需要在某个时刻将事件广播出去触发监听动作  Spring提供了ApplicationEventPublisher接口  如下:

我们只需要注入ApplicationContext   然后发布就可以了  如下:

通过publishEvent发布触发事件

publishEvent方法会将我们的事件通知给监听器  这个场景叫做广播。也就是说,将该事件广播出去,但凡对该事件感兴趣的监听器均被通知到,这个逻辑是在AbstractApplicationContext的publishEvent中实现的,也就是说AbstractApplicationContext实现了ApplicationEventPublisher 接口的publishEvent方法  

通过以上源码得知对event进行了处理,尝试转换为ApplicationEvent或PayloadApplicationEvent,如果是PayloadApplicationEvent则获取eventType 其次判断earlyApplicationEvents是否为空(也就是早期事件还没有被发布-说明广播器还没有实例化好),如果不为空则将当前事件放入否则获取ApplicationEventMulticaster调用其multicastEvent将事件广播出去。本文这里获取到的广播器实例是SimpleApplicationEventMulticaster。最后如果其parent不为null,则尝试调用父类publishEvent方法

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring中ApplicationListener事件监听机制详解 的相关文章

随机推荐

  • Keil 逻辑分析 Logic Analyzer 窗口 realview mdk 逻辑分析 窗口 监视 IO 引脚状态

    Keil 逻辑分析 Logic Analyzer 窗口 realview mdk 逻辑分析 窗口 监视 IO 引脚状态 找了好久没找到怎么查看IO引脚的逻辑时序图 帮助里也没有介绍 最后还是让我找到了 哈哈 点菜单 VIEW gt symb
  • Selenium元素定位方法

    前提 必须定位到唯一元素 1 id定位 driver find element by id kw send keys 日历 2 name定位 driver find element by name wd send keys 杰森 3 cla
  • mysql判断日期写法

    mysql判断时间是否是当天 昨天 今天 select count 1 from sign detail where date format create time Y m d date format now Y m d and membe
  • 如何分辨NMOS和PMOS的电路符号

    这个是N沟道增强型MOS管的电路符号 这个是P沟道增强型MOS管的电路符号 有时我们很容易把这两个符号弄混 首先对于单个MOS管而言内部衬底和源极是接在一起的 所以我们看到的MOS管电路符号 源极和衬底是接在一起的 并且这个箭头处的电极为衬
  • 通过RS485进行modbus通讯协议

    一 协议介绍 普通串口挂载485芯片 使用modbus协议来传递信息 modbus 也有ASCII和 RTU之分 这是他们之间的区别 协议 开始标记 结束标记 校验 传输效率 程序处理 ASCII 冒号 CR LF LRC 低 直观 简单
  • 动态贝叶斯网络DBN

    贝叶斯网络 贝叶斯网络 Bayesian Networks 也被称为信念网络 Belif Networks 或者因果网络 Causal Networks 是描述数据变量之间依赖关系的一种图形模式 是一种用来进行推理的模型 贝叶斯网络为人们提
  • 【Android】RxJava+Retrofit+OKHttp3实现数据上传

    依赖引入 Gson implementation com squareup retrofit2 converter gson 2 1 0 OkHttp3 implementation com squareup okhttp3 okhttp
  • SQL语言---数据更新

    文章目录 前言 一 数据更新之插入数据 1 插入单个元组 1 语句格式 2 语法说明 INTO子句 VALUES子句 插入规则 3 举例讲解 例子1 例子2 易犯错误 2 插入子查询结果 1 语句格式 2 语法说明 INTO子句 与插入单条
  • 成功解决RuntimeError: Input type (torch.FloatTensor) and weight type (torch.cuda.FloatTensor) should be

    错误代码 问题原因 这是由于Input type 与weight type的类型不符合 可以注意到Input type是没有cuda的 而weight type是在cuda上也就是有gpu的加载的 错误代码后的or可以不用管 解决办法 既然
  • DBA 面试题目

    from ITPUB more 技术方面 1 解释冷备份和热备份的不同点以及各自的优点 解答 热备份针对归档模式的数据库 在数据库仍旧处于工作状态时进行备份 而冷备份指在数据库关闭后 进行备份 适用于所有模式的数据库 热备份的优点在于当备份
  • c 语言超时溢出问题

    在嵌入式开发过程中 经常会遇到溢出问题 例如在使用软定时判断时间是否超时 如下 if timer ticks gt timeout timer ticks是一个无符号数 假如是一个无符号8位 当timer ticks为254 超时时间为2个
  • 【100%通过率 】【华为OD机试真题c++ 】最大平分数组【 2023 Q1

    华为OD机试 题目列表 2023Q1 点这里 2023华为OD机试 刷题指南 点这里 题目描述 给定一个数组nums 可以将元素分为若干个组 使得每组和相等 求出满足条件的所有分组中 最大的平分组个数 输入描述 第一行输入 m 接着输入m个
  • awk与shell参数传递(或说变量传递)二三点

    awk与shell间参数 或说变量传递 是shell编程中常有的话题了 因为其中实际涉及到不少的知识点 比如包括 a 进程进通信 b awk参数形式 c shell命令解析 命令替换 等等 在此列举二三点例子 做为小结 以下主要分为二部分
  • 路由器工作原理

    定义 路由器 router 是互联网的枢纽 是连接英特网中各局域网 广域网的设备 它会根据信道的情况自动选择和设定路由 以最佳路径 按前后顺序发送数据 作用在OSI模型的第三层 提供了路由与转发两种重要机制 路由 路由器控制层面的工作 决定
  • 使用Python绘制余弦函数的可视化曲线

    使用Python绘制余弦函数的可视化曲线 余弦函数是一种重要的三角函数 其图像可以用来描述很多自然现象 在Python中 我们可以使用plot函数快速地绘制出余弦曲线的图像 首先 我们需要导入必要的库 import numpy as np
  • 如何在H264数据中获取PTS

    H264的ES原始数据一般是以NAL Network Abstract Layer 的格式存在 可以直接用于文件存储和网络传输 每一个NALU Network Abstract Layer Unit 数据 是由数据头 RBSP数据组成 首先
  • 计算1~100之间所有整数的和

    sum 0 for i in range 1 101 sum sum i print sum 5050 sum 0 i 1 while i lt 100 sum sum i i i 1 print sum 5050
  • 在VBA中写SQL语句的注意事项

    最近使用VBA连接MySQL数据库比较多 总结出一些书写方面的注意事项 分享出来 希望能给大家一些提示 同时也给自己做个备忘 1 单引号 双引号 在标准SQL语句中 字符串使用的是单引号 但是MySQL中 单引号和双引号都适用 平时使用时也
  • Python学习第七篇:sys标准库

    Python学习第七篇 sys标准库 活动地址 CSDN21天学习挑战赛 Python的sys模块提供访问由解释器使用或维护的变量的接口 并提供了一些函数用来和解释器进行交互 操控Python的运行时环境 要进行使用 直接导入即可 impo
  • Spring中ApplicationListener事件监听机制详解

    1 概述 Spring中事件监听 也有说法叫事件通知 机制 其实本质是观察者模式的应用 当某个事件发生时 其会被广播出去 监听该实践的listener就会被触发然后执行响应的动作 该模式可良好应用于程序解耦 类似消息的发布订阅 它的事件监听