Spring 监听器listener原理

news2025/1/13 2:52:05

1.创建本地事件和事件监听器

/**
 * 事件类
 */
public class MyEventA extends ApplicationEvent {

    private static final long serialVersionUID = 1L;

    public MyEventA(Object source) {
        super(source);
        System.out.println("MyEventA 构造方法被执行了...");
    }

    public void out(String name){
        System.out.println("MyEventA .... out方法执行了"+name);
    }
}
/**
 * 监听器
 */
public class MyListenerA implements ApplicationListener<MyEventA> {

    @Override
    public void onApplicationEvent(MyEventA event) {
        System.out.println("======MyListenerA 监听器触发了...");
        // 执行事件中的特定方法
        event.out("AAAAA");
    }
}

2 触发发送事件

public class TestListenerController {

    @Autowired
    private ApplicationContext mApplicationContext;
    
    @GetMapping("/testlistener")
    public String testPublishEvent(){
        System.out.println("====>get");
        mApplicationContext.publishEvent(new MyEventA(new Object()));
        return "";
    }
}

3 添加注册器到spring.factories

图1

4 项目启动时候会将listener 实例化到内存中

走到SpringApplication的构造方法中,会走到getSpringFactoriesInstances方法中,实例化listener类型的类,通过setListeners方法保存在内存中

图2

图3

5. 执行Controller方法

http://localhost:8081/testlistener

会执行mApplicationContext.publishEvent(new MyEventA(new Object()));

图4

执行到SimpleApplicationEventMulticaster类中的multicastEvent

图5

执行SimpleApplicationEventMulticaster父类AbstractApplicationEventMulticaster中的getApplicationListeners方法找到匹配的listener,在执行到retrieveApplicationListeners方法

图6

图7

执行GenericApplicationListenerAdapter类中supportsEventType方法

declaredEventType.isAssignableFrom(eventType))将需要监听的对象和发送的事件对象匹配,匹配成功将此listener,也就是之前声明的MyListenerA实例化对象,添加到发送列表

图8

最好执行图5中的invokeListener(listener, event),将事件发送到对应的监听器

综上流程可以看出,spring的事件发送接收是一种观察者模式,即注册监听模式,当应用启动的时候,根据spring.factories文件,将监听器实例化后保存在内存中,到有触发动作是,根据发送的事件类型,从所有初始化的监听器中找到匹配的监听器,在发送事件对象

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于matlab开发的车牌检测与字符分割项目附源码

文章目录1 任务概述项目完整matlab源码2 基本流程2.1 车牌定位2.1.1 图像预处理2.1.2 边缘检测2.1.3 形态学操作2.1.4 重操作判断2.1.5 区域选择2.1.6 倾斜校正2.1.7 精确选择2.2 字符分割2.3 字符识别3 结果分析3.1 车牌定位3.2 字符分割3.3 字符识别4 总结5 参考资料1 任务概…

安装vim的最新版本

1、通过源码安装 对于Linux系统&#xff0c;可以通过源码编译来安装最新版本&#xff0c;我在wsl ubuntu下的操作如下&#xff1a; 获取vim的源码&#xff1a; git clone https://github.com/vim/vim.git刚开始我帆了墙&#xff0c;结果下载不动&#xff0c;关了帆墙软件可正常…

【入门AUTOSAR网络管理测试】AUTOSAR网络管理规范需求解读

文章目录前言一、名词解释二、NM报文1.NM报文格式2.NM报文数据场内容三、NM状态机1.NM状态转换图2.状态前言 AUTOSAR Automotive Open System Architecture&#xff0c;汽车开放系统架构&#xff0c;由全球汽车制造商、部件供应商及其他电子、半导体和软件系统公司联合建立&am…

Qt扫盲-QPlainTextEdit理论总结

QPlainTextEdit理论总结一、概述二、用途一&#xff1a;纯文本展示1. 用法2. 只读快捷键三、用途二&#xff1a;纯文本编辑器1. 用法2. 快捷键绑定四、与 QTextEdit 的不同一、概述 QPlainTextEdit是一个只支持纯文本的高级查看器/编辑器。 它经过优化&#xff0c;可以处理大型…

Mac系统下matplotlib中SimHei中文字体缺失报错的解决办法

问题描述import matplotlib.pyplot as plt plt.rcParams[font.sans-serif][SimHei] plt.rcParams[axes.unicode_minus]False使用matplotlib画图时&#xff0c;因为缺少字体&#xff0c;、图像上label上的中文显示时空白小方块。因为matplotlib默认没有中文。解决方法&#xff…

多维时序 | MATLAB实现VMD-SSA-KELM和VMD-KELM变分模态分解结合麻雀算法优化核极限学习机多输入单输出时间序列预测

多维时序 | MATLAB实现VMD-SSA-KELM和VMD-KELM变分模态分解结合麻雀算法优化核极限学习机多输入单输出时间序列预测 目录多维时序 | MATLAB实现VMD-SSA-KELM和VMD-KELM变分模态分解结合麻雀算法优化核极限学习机多输入单输出时间序列预测预测效果基本介绍程序设计学习小结参考资…

城堡、游乐园、地下城!!!500+ 超棒 FBX 模型素材,全部都免费!

近期 Cocos 社区有好几位热心的开发者&#xff0c;整理了一些 CC0 协议 的游戏资源。如果你对 CC0 协议还不太了解&#xff0c;我找到一个中文版的协议说明&#xff0c;看下图&#xff1a;有几点比较重要&#xff1a;作者放弃著作权&#xff0c;已将作品贡献至公共领域可以复制…

【ROS】—— 机器人系统仿真 —RDF、Gazebo与Rviz综合应用(十六)

文章目录前言1. 机器人运动控制以及里程计信息显示1.1 ros_control 简介1.2 运动控制实现流程(Gazebo)1.2.1 为 joint 添加传动装置以及控制器1.2.2 xacro文件集成1.2.3 启动 gazebo并控制机器人运动2. 雷达信息仿真以及显示2.1 新建 Xacro 文件&#xff0c;配置雷达传感器信息…

C++STL之vector的模拟实现

由于vector和string的接口使用方法类似&#xff0c;这里便不再详细讲解vector各种接口的使用了&#xff0c;可以参考之前所发布的string的使用&#xff0c;或者从官方文档中获取详细的使用方法. 目录 vector介绍 构造函数&#xff08;有参&#xff0c;无参&#xff0c;迭代器…

【14】Docker network | bridge | host | none | container

目录 1、Docker 运行的基本流程为: 2、Docker0 3、Docker默认的三种网络模式 4、Docker的网络命令 5、网络模式 6、实例&#xff1a; 7、bridge模式 8、host模式 9、none模式 10、container模式 11、自定义网络 1、Docker 运行的基本流程为: 1.用户是使用 Docker Clie…

UDS诊断系列介绍10-28服务

本文框架1. 系列介绍1.1 28服务概述2. 28服务请求与应答2.1 28服务请求2.2 28服务正响应2.3 否定应答3. Autosar系列文章快速链接1. 系列介绍 UDS&#xff08;Unified Diagnostic Services&#xff09;协议&#xff0c;即统一的诊断服务&#xff0c;是面向整车所有ECU的一种诊…

session利用的小思路

session利用的小思路 前言 做题的时候经常考到session利用&#xff0c;常见的基本就两种&#xff0c;session文件包含和session反序列化&#xff0c;之前没有详细总结过&#xff0c;就写写吧。 session文件包含 php.ini session的相关配置 session.upload_progress.enabl…

15、ThingsBoard-自定义阿里云SMS规则节点

1、概述 一个物联网平台承载着很多设备的连接,当设备出现异常的时候,能够快速的通知到运维管理员是非常重要的,thingsboard提供了自定义配置邮箱,但是它对支持发送短信的不是很友好,都是国外的sms服务商,我反正是不用那个,在国内常见就是阿里、腾讯、华为、七牛常用的s…

CORBA,Common Object Request Broker Architecture 简介

CORBA&#xff0c;Common Object Request Broker Architecture 简介 1. 简介 CORBA&#xff08;Common ObjectRequest Broker Architecture&#xff0c;公共对象请求代理体系结构&#xff09;是由OMG组织&#xff08;OMG组织是一个国际性的非盈利组织&#xff0c;其职责是为应…

【17】Docker | CAdvisor_InfluxDB_Granfana | 成功安装

目录 1、查看目前docker容器的状态 2、三大组件 【1】、CAdvisor 【2】、InfluxDB 【3】、Granfana 3、用docker-compose安装三个组件 4、三大组件的登录 【1】浏览cAdvisor收集服务&#xff0c;http://ip:8080 【2】浏览influxdb存储服务&#xff0c;http://ip:8083 …

python日志处理模块讲解-loguru

说明&#xff1a; 本篇文章主要讲的是python日志模块loguru详解&#xff0c;感兴趣的同学赶快来看一看吧。 背景&#xff1a; 在部署一些定时运行或者长期运行的任务时&#xff0c;为了留存一些导致程序出现异常或错误的信息&#xff0c;通常会采用日志的方式来进行记录这些…

运放指标-压摆率SR

1. 压摆率SR 处理交流信号时&#xff0c;压摆率是运放器件重要的指标。其表示运放输出电压的转换速率。在高频信号时&#xff0c;若压摆率不够&#xff0c;则运放输出的信号会变形&#xff0c;导致不满足要求。其实际就是运放输出信号的分辨率&#xff0c;只有分辨率足…

机器学习中的数学基础(四):概率论

机器学习中的数学基础&#xff08;四&#xff09;&#xff1a;概率论4 概率论4.1 一些概念4.2 二维随机变量4.2.1 离散型4.2.2 连续型4.3 边缘分布4.3.1 离散型边缘分布4.3.2 连续型边缘概率密度4.4 期望4.4.1 一维期望4.4.2 二维期望4.5 马尔可夫不等式4.6 切比雪夫不等式在看…

Vue2.0开发之——组件数据共享-Eventbus(39)

一 概述 兄弟组件之间数据共享的方案—EventBusEventBus的使用步骤EventBus的使用示例 二 兄弟组件之间数据共享的方案—EventBus 在 vue2.x 中&#xff0c;兄弟组件之间数据共享的方案是EventBus。 三 EventBus的使用步骤 创建 eventBus.js 模块&#xff0c;并向外共享一…

个人项目部署在云服务器上以及购买云服务器后如何操作

一. 购买云服务器后简单的操作1.镜像: 镜像可以认为是云服务器的操作系统&#xff0c;选择什么镜像云服务器就安装对应的操作系统。云服务器操作系统主要分为两大类&#xff0c;即Linux和Windows. 本次说明在linux操作系统下进行项目的部署, 那么在选择镜像的时可以选择Linux镜…