spring监听事件
1、spring-监听事件基本原理
- Spring的事件监听机制和发布订阅机制是很相似的:发布了一个事件后,监听该类型事件的所有监听器会触发相应的处理逻辑
2、Spring 监听事件相关规范
在Spring中,事件监听机制主要涉及到了一下几个关键的规范(抽象类及接口):ApplicationEvent
、ApplicationListener
ApplicationEventPublisher
-
ApplicationEvent: Spring的事件是符合jdk的规范的,这个抽象类继承了jdk内置的事件规范类
EventObject
(即jdk建议所有的事件都继承EventObject这个类)。ApplicationEvent
是Spring家的事件规范。所以我们在自定义事件的时候,可以继承与ApplicationEvent,比如,Spring家自己关于容器上下文事件就又定义了一个容器上下文的时间规范ApplicationContextEvent,它同样是继承于ApplicationEvent的,只不过扩充了获取发出事件容器的方法;今后,我们同样可以在继承于ApplicationEvent的基础上定义自己的事件规范。 -
ApplicationListener:这是一个函数式接口,同样时事件监听器的规范,当监听到自己监听的事件类型时就会调用
onApplicationEvent
方法来执行监听逻辑 -
ApplicationEventPublisher:这同样是一个函数式接口,定义了事件发布的规范,任何的事件发布器
ApplicationEventPublisher
都是通过调用publishEvent来进行事件的发布
3、代码实现-自定事件
public class MyEvent extends ApplicationEvent {private user user;//注册方法也行。list<> 集合,对象public MyEvent(Object source, user user) {super(source);this.user = user;}public user getMessage() {return user;}
}
定义一个user实体类
@Data
public class user {
private String name;
private String age;}
4、监听事件
- springboot进行事件监听有四种方式,选择任意一种即可
- 将监听器装载入spring容器(常用)
- 通过@EventListener注解实现事件监听(常用)
- 手工向ApplicationContext中添加监听器
- 在application.properties中配置监听器
- 4.1、 监听–ApplicationListener
@Component
@Slf4j
public class MyListener1 implements ApplicationListener<MyEvent> {@Overridepublic void onApplicationEvent(MyEvent event) {//写自己的方法log.info("{}监听器1:监听到事件{}",MyListener1.class.getName(),event.getMessage());System.out.println("---------------------->监听器1:监听到事件");}
}
- 4.2、 监听–注释
@Component
@Slf4j
public class MyListener2 {@EventListener(value = MyEvent.class)@Asyncpublic void listener(MyEvent event) {//写自己的方法log.info("{}监听器1:监听到事件{}", MyListener2.class.getName(),event.getMessage());System.out.println("---------------------->监听器1:监听到事件");}
}
- 4.3、监听–配置文件
通过配置文application.properties中配置监听器: context.listener.classes=com.listener.MyListener1
- 4.4、监听–手动添加监听
@SpringBootApplication
public class SpringListenerApplication {public static void main(String[] args) {ConfigurableApplicationContext run = SpringApplication.run(SpringListenerApplication.class, args);// 添加监听器run.addApplicationListener(new MyListener1());}}
5、发布事件
//使用 applicationContext 和ApplicationEventPublisher 都可以发布事件,人选则其一即可。
@RestController
@RequestMapping("/my")
public class MyController {@Autowiredprivate ApplicationContext applicationContext;//@Autowired// private ApplicationEventPublisher applicationEventPublisher;@RequestMapping("/test")public void test() {user user = new user();user.setName("GJ");user.setAge("12");System.out.println(applicationContext.getApplicationName());applicationContext.publishEvent(new MyEvent(this,user));// applicationEventPublisher.publishEvent(new MyEvent(this,user));}}
//直接访问即可
6、工作中使用 ----发布者模式
@Component
public class ApplicationContextUtil implements ApplicationContextAware{private static ApplicationContext applicationContext;private ApplicationContextUtil() {}public static <T> T getBean(Class<T> clazz) throws BeansException{return applicationContext.getBean(clazz);}public static void publishEvent(Object event){;applicationContext.publishEvent(event);}public static ApplicationContext getApplicationContext(){return applicationContext;}@Overridepublic void setApplicationContext(ApplicationContext context) throws BeansException {applicationContext = context;}}
- 6.1、添加 NoticeDto 类对MyEvent进行继承
@Data
public class NoticeDto extends MyEvent{private String noticeType;public NoticeDto(Object source) {super(source);}
}
@Data
public class MyEvent extends ApplicationEvent {private String message;//ApplicationEvent 需要有参的构造,所以必须调用superpublic MyEvent(Object source) {super(source);}
}
- 6.2、监听器
@Component
@Slf4j
public class MyListener3 {@EventListener@Async//当然这个地方也可以使用NoticeDto 作为参数。public void listener(MyEvent event) {
// 假设 MyEvent 是 NoticeDto 的父类或接口,并且某个 MyEvent 类型的对象 event 实际上是 NoticeDto 的一个实例。
// 当这个对象被传递给 listener 方法时,它仍然保持着其作为 NoticeDto 实例的所有属性和值。
// 在方法内部,通过 (NoticeDto) event 进行向下转型,将这个对象视为 NoticeDto 类型,从而可以访问 NoticeDto 特有的属性和方法。
// 由于对象的内部状态在转换过程中没有改变,所以 NoticeDto 的属性会保留其原有的值。 总的来说,转换类型并没有改变对象的实际内容,只是改变了我们与对象交互的方式。
// 因此,NoticeDto 中的属性在转换后仍然保持其原有的值。NoticeDto event1 = (NoticeDto) event;//写自己的方法log.info("{}监听器:监听到事件{}", MyListener3.class.getName(),event.getMessage());System.out.println("---------------------->监听器:监听到事件");System.out.println(event.getMessage()+"\n"+event.getSource().getClass().getName());System.out.println(event1.getNoticeType());System.out.println(event1.getMessage());}
}
- 6.3、访问测试:
@RequestMapping("/test2")public void test2() {//不管怎么写,都会被监听,但必须传送一个 object source,传送什么无所谓。NoticeDto noticeDto = new NoticeDto(this);noticeDto.setNoticeType("123");noticeDto.setMessage("abc");ApplicationContextUtil.publishEvent(noticeDto);}
}
//结果为:
2024-07-09 23:43:57.180 INFO 8100 --- [nio-8888-exec-1] com.example.listener.MyListener3 : com.example.listener.MyListener3监听器:监听到事件abc
---------------------->监听器:监听到事件
abc
com.example.listener.MyController
123
abc
相关文章:
spring监听事件
1、spring-监听事件基本原理 Spring的事件监听机制和发布订阅机制是很相似的:发布了一个事件后,监听该类型事件的所有监听器会触发相应的处理逻辑 2、Spring 监听事件相关规范 在Spring中,事件监听机制主要涉及到了一下几个关键的规范&#x…...

微软发布E2 TTS: 一种简单但效果优秀的文本转语音技术
本文介绍了一种名为“Embarrassingly Easy Text-to-Speech(E2 TTS)”的文本转语音系统。 该系统通过将输入文本转换为填充标记字符序列,并基于音频填充值任务训练流匹配基mel频谱生成器,实现了人类水平的自然度和最先进的说话人相…...

python爬虫加入进度条
安装tqdm和requests库 pip install tqdm -i https://pypi.tuna.tsinghua.edu.cn/simplepip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple带进度条下载 import time # 引入time模块,用于处理时间相关的功能 from tqdm import * # 从tqdm包中…...
力扣844.比较含退格的字符串
力扣844.比较含退格的字符串 栈模拟 class Solution {public:bool backspaceCompare(string s, string t) {int n s.size(),m t.size();stack<char> s1,s2;for(int i0;i<n;i){s1.push(s[i]);if(s[i] #){if(s1.size() 1) s1.pop();else s1.pop(),s1.pop();}}for(i…...
用户特征和embedding层做Concatenation
要将用户特征与嵌入层进行连接,可以使用深度学习框架(如TensorFlow或PyTorch)中的基本操作。以下是使用PyTorch的示例代码,展示了如何将用户特征与嵌入层连接起来。 示例代码(使用PyTorch) 安装 PyTorch 如…...

Ubuntu20.04下修改samba用户密码
Ubuntu20.04下修改samba用户密码 在Ubuntu系统中,修改samba密码通常涉及到两个方面:更改samba用户的密码和重置samba服务的密码数据库。以下是如何进行操作的步骤: 1、更改samba用户密码: 打开终端,使用以下命令更改…...

PHP老照片修复文字识别图像去雾一键抠图微信小程序源码
🔍解锁复古魅力,微信小程序黑科技大揭秘!老照片修复&更多神奇功能等你来试! 📸 【老照片修复,时光倒流的美颜术】 你是否珍藏着一堆泛黄的老照片,却因岁月侵蚀而模糊不清?现在…...
识别色带详解解释
这段代码主要用于检测图像中的绿色区域,并在检测到特定数量的绿色像素时采取相应的动作。下面是每行代码的详细解释: if (divergerColor "green") {目的: 检查当前 divergerColor 是否为 “green”。如果是,则进入代码块进行绿色…...
如何用 Python 绕过 cloudflare(5秒盾) 抓取数据:也不是很难嘛!
大家好!我是爱摸鱼的小鸿,关注我,收看每期的编程干货。 逆向是爬虫工程师进阶必备技能,当我们遇到一个问题时可能会有多种解决途径,而如何做出最高效的抉择又需要经验的积累。本期文章将以实战的方式,带你全面了解 cloudflare(5秒盾) 以及如何绕过使用 cloudflare 服务…...
掌握Conda配置术:conda config命令的深度指南
掌握Conda配置术:conda config命令的深度指南 引言 Conda是一个功能强大的包管理器和环境管理器,广泛用于Python和其他科学计算语言的依赖管理。conda config命令是Conda套件中用于配置和自定义Conda行为的关键工具。通过这个命令,用户可以…...
MySQL:left join 后用 on 还是 where?
在MySQL中,LEFT JOIN用于返回左表(即LEFT JOIN关键字左边的表)的所有记录,即使在右表中没有匹配的记录。对于那些右表中没有匹配的记录,结果集中右表的部分会被填充为NULL。关于ON和WHERE子句的使用,它们在…...
openfoam生成的非均匀固体Solid数据分析、VTK数据格式分析、以及paraview官方用户指导文档和使用方法
一、openfoam生成的非均匀固体Solid数据分析 二、VTK数据格式分析 三、paraview官方用户指导文档和使用方法 官网文档链接:在paraview软件中,点击工具栏中的help->paraview guide 即可直接跳转到浏览器打开官网指导页面。 官网链接如下:…...

JVM:类的生命周期
文章目录 一、介绍二、加载阶段三、连接阶段1、验证阶段2、准备阶段3、解析阶段 四、初始化阶段 一、介绍 类的生命周期描述了一个类加载、连接(验证、准备和解析)、初始化、使用、卸载的整个过程。 二、加载阶段 加载(Loading)…...

几种不同的方式禁止IP访问网站(PHP、Nginx、Apache设置方法)
1、PHP禁止IP和IP段访问 <?//禁止某个IP$banned_ip array ("127.0.0.1",//"119.6.20.66","192.168.1.4");if ( in_array( getenv("REMOTE_ADDR"), $banned_ip ) ){die ("您的IP禁止访问!");}//禁止某个IP段…...

经典 SQL 数据库笔试题及答案整理
最近有蛮多小伙伴在跳槽找工作,但对于年限稍短的软件测试工程师,难免会需要进行笔试,而在笔试中,基本都会碰到一道关于数据库的大题,今天这篇文章呢,就收录了下最近学员反馈上来的一些数据库笔试题…...

JS代码动态打印404页面源码
JS代码动态打印404页面源码,适合做网站错误页,具有js动态打印效果,喜欢的朋友可以拿去 源码由HTMLCSSJS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行效果,也可以上传到服务…...

从“钓”到“管”:EasyCVR一体化视频解决方案助力水域安全管理
一、背景 随着城市化进程的加快,越来越多的市民热衷于钓鱼活动。钓鱼活动在带来乐趣的同时,也伴随着一定的安全隐患。尤其是在一些危险水域,也经常出现垂钓者的身影,非法垂钓,这给城市管理带来了不小的阻力。传统的人…...

springboot大学生竞赛管理系统-计算机毕业设计源码37276
摘 要 随着教育信息化的不断发展,大学生竞赛已成为高校教育的重要组成部分。传统的竞赛组织和管理方式存在着诸多问题,如信息不透明、效率低下、管理不便等。为了解决这些问题,提高竞赛组织和管理效率,本文设计并实现了一个基于Sp…...

提高LabVIEW软件的健壮性
提高LabVIEW软件的健壮性,即增强其在各种操作条件下的可靠性和稳定性,是开发过程中非常重要的一环。健壮的软件能够在面对意外输入、极端环境和系统故障时依然表现出色,确保系统的连续性和可靠性。以下是详细的方法和策略,从多个角…...

不同深度的埋点事件如何微妙地改变广告系列的成本
/ 作者简介 / 本篇文章来自现金贷领域市场投放大佬 亮哥 的投稿,主要分享了在广告投放过程中,不同深度的埋点事件如何微妙地改变广告系列的成本的相关经验,相信会对大家有所帮助!同时也感谢作者贡献的精彩文章。 / 前言 …...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
离线语音识别方案分析
随着人工智能技术的不断发展,语音识别技术也得到了广泛的应用,从智能家居到车载系统,语音识别正在改变我们与设备的交互方式。尤其是离线语音识别,由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力,广…...

AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)
Name:3ddown Serial:FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名:Axure 序列号:8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...