Spring事件快速上手
文章目录
- 应用场景
- 核心接口
- 使用步骤
- 异步事件
- 事件排序
Spring 事件(Application Event)是 Spring 框架中实现观察者模式的一种方式,可以通过发布者和监听器来处理事件,常用于类之间解耦合、异步操作。
观察者模式:观察者模式(委托和事件)——老板来了我不知道
应用场景
举例几个具体的使用场景:
- 用户注册后发送欢迎邮件:用户注册成功后,可以发布一个事件,由监听该事件的邮件服务来发送欢迎邮件。
- 订单处理:订单创建后,可以发布一个事件,由库存管理、支付处理、物流跟踪等不同的服务来监听和处理。
- 数据变更通知:当数据库中的数据发生变化时,可以发布一个事件,由需要这些数据的其他服务来更新缓存或执行其他逻辑。
- 日志记录和监控:在关键操作执行时,可以发布事件来进行日志记录或监控,而不需要在业务逻辑中直接调用日志服务。
核心接口
- ApplicationEvent:所有事件的父类,继承自
java.util.EventObject。 - ApplicationListener:用于监听事件的接口,它定义了一个
onApplicationEvent(E event)方法,当有事件发布时,该方法会被调用。 - ApplicationEventPublisher:用于发布事件的接口,通常由 Spring 容器实现。
- ApplicationEventMulticaster:用于管理事件监听器的注册和事件的广播。
使用步骤
-
定义事件:创建一个继承自
ApplicationEvent的类。public class CustomEvent extends ApplicationEvent {private String message;// 构造器注入的方式记录事件msgpublic CustomEvent(Object source, String message) {super(source);this.message = message;}public String getMessage() {return message;} } -
注册监听器:
- 创建一个实现
ApplicationListener接口的类。
@Component public class CustomEventListener implements ApplicationListener<CustomEvent> {@Overridepublic void listener(CustomEvent event) {System.out.println("监听到事件发生啦- " + event.getMessage());} }- 或者使用@EventListener,不必实现 ApplicationListener 接口,在任何 Spring 管理的 bean 上直接声明事件监听方法。
@Component public class CustomEventListener {@EventListenerpublic void listener(CustomEvent event) {System.out.println("监听到事件发生啦- " + event.getMessage());} }- 指定条件:如果需要根据条件来决定是否调用监听器方法,可以在
@EventListener注解中使用condition属性。
@EventListener(condition = "#event.message.contains('important')")public void listener(CustomEvent event) {System.out.println("监听到事件发生啦- " + event.getMessage());} - 创建一个实现
-
发布事件:通过自动注入
ApplicationEventPublisher来发布事件。@Component public class CustomEventPublisher {@Autowiredprivate final ApplicationEventPublisher publisher;public void publishCustomEvent(String message) {CustomEvent customEvent = new CustomEvent(this, message);publisher.publishEvent(customEvent); //把消息装进事件中} } -
配置和运行:确保以上组件被 Spring 容器管理,并调用
publishCustomEvent方法来发布事件。
异步事件
Spring 也支持异步事件。要启用异步事件处理,可以在配置中定义一个 @Async 注解的方法。
@Async@EventListenerpublic void listener(CustomEvent event) {System.out.println("监听到事件发生啦- " + event.getMessage());}
事件排序
如果需要确保事件的监听器按照特定的顺序执行,可以使用 @Order 注解或实现 Ordered 接口。
@Order(1)
@EventListener
public void listener(CustomEvent event) {System.out.println("监听到事件发生啦 - " + event.getMessage());
}
import org.springframework.context.ApplicationListener;
import org.springframework.core.Ordered;public class FirstEventListener implements ApplicationListener<CustomEvent>, Ordered {@Overridepublic void listener1(CustomEvent event) {System.out.println("我第一个听到我第一个执行: " + event.getMessage());}@Overridepublic int getOrder() {return 1; // 低值优先执行}
}public class SecondEventListener implements ApplicationListener<CustomEvent>, Ordered {@Overridepublic void listener2(CustomEvent event) {System.out.println("我第二个听到我第二个执行: " + event.getMessage());}@Overridepublic int getOrder() {return 2; // 高值后执行}
}相关文章:
Spring事件快速上手
文章目录 应用场景核心接口使用步骤异步事件事件排序 Spring 事件(Application Event)是 Spring 框架中实现观察者模式的一种方式,可以通过发布者和监听器来处理事件,常用于类之间解耦合、异步操作。 观察者模式:观察者…...
java算法递归算法练习-数组之和
简单找个题目练习一下递归算法,输入一组数组,使用递归的方法计算数组之和。其实这个题目,用循环的方式也很简单就能解决,直接循环遍历一下相加就行了,但是我们用来练习一下递归。 先来找基线条件和递归条件 基线条件…...
在kdevelop中运行程序并调试
补充前序知识: 1.CMakeLists.txt文件中,如下图,第一行生成的是静态库文件(我们前一讲所使用的),第二行是动态库文件。 静态库与动态库: 静态库(Static Libraries) 定义…...
MySQL数据库-SQL编程
一、触发器 1.触发器简介 触发器(trigger)是一个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, u…...
TypeError: Components is not a function
Vue中按需引入Element-plus时,报错TypeError: Components is not a function。 1、参考Element-plus官方文档 安装unplugin-vue-components 和 unplugin-auto-import这两款插件 2、然后需要在vue.config.js中配置webPack打包plugin配置 3、重新启动项目会报错 T…...
GuLi商城-商品服务-API-平台属性-销售属性维护
公用之前的接口,改下入参:...
使用Leaflet GeoMan结合天地图进行自由标绘实战
目录 前言 一、Leaflet GeoMan是什么 1、关于Leaflet GeoMan 2、关于开源版和企业版 3、相关的方法介绍 二、使用Geoman来进行自由标绘实战 1、相关资源准备 2、新建html网页 3、初始化地图及绑定Geoman控件 三、自由标绘的成果 1、整体效果 2、添加空间对象 3、开…...
Flutter自定义通用防抖的实现
在前端项目开发中,点击事件的防抖是一个永远无法错开的点,特别是针对一些复杂的业务场景,如果不做好防抖操作,就会导致页面或功能触发多次,引发异常或闪退。 在Flutter中可以通过扩展函数的特性 对Function增加全局扩…...
C# Unity 面向对象补全计划 之 继承(字段与属性)
本文仅作学习笔记与交流,不作任何商业用途,作者能力有限,如有不足还请斧正 本系列旨在通过补全学习之后,给出任意类图都能实现并做到逻辑上严丝合缝 Q:为什么要单讲继承字段与属性,不讲继承方法了吗&#x…...
leetcode202. 快乐数,双指针法巧用
leetcode202. 快乐数 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为: 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。 如果这个过程…...
基于Cobbler实现多版本系统批量部署
一、实验题目 基于Cobbler实现多版本操作系统的批量部署。 二、实验目的 掌握Cobbler服务器的安装与配置方法。 学会使用Cobbler进行多版本操作系统的批量部署。 理解PXE网络启动原理及其在操作系统部署中的应用。 提高在实际生产环境中快速部署和管理操作系统的能力。 …...
一投就中不是梦,录取率>80%,最快1个月就见刊,计算机沾边就收,认可度还不低
本次模术狮精心整理5本期刊,最快1个月就见刊,计算机沾边就收,认可度还不低! 1 Knowledge-Based Systems ▲ 图片来源:Knowledge-Based Systems官网 期刊简介:《Knowledge-Based Systems》是人工智能领域的…...
【课程系列06】某乎AI大模型全栈工程师-第6期
网盘链接 链接:https://pan.baidu.com/s/1QLkRW_DmIm1q9XvNiOGwtQ --来自百度网盘超级会员v6的分享 课程目标 【知乎大模型课程】学习的四个维度 👉指挥层:学高阶指令工程 AI编程等,指挥大模型完成90%代码任务,包…...
Prompt——3分钟掌握,润色论文的7条经典指令。帮助很大,一定要看!
这是一篇帮助你润色论文的ChatGPT指令合集,整理了润色过程中语法优化、审阅校对、专业风格等7个主要方面。 建议收藏,需要的时候直接CtrlV即可,一定对你科研有所帮助~ 1. 修复语法和句法 第一个提示是修复语法和句法。这是任何写作的关键部…...
ARM学习(31)编译器对overlay方式的支持
ARM学习(31)编译器对overlay方式的支持 1、overlay介绍 overlay:重叠得意思,就是可以重复利用得空间,一般在内存上使用这种空间。比如以Windows操作系统为例,其存储空间(ROM/FLASH)…...
【YashanDB知识库】yasdb jdbc驱动集成BeetISQL中间件,业务(java)报autoAssignKey failure异常
问题现象 BeetISQL中间件版本:2.13.8.RELEASE 客户在调用BeetISQL提供的api向yashandb的表中执行batch insert并将返回sequence设置到传入的java bean时,报如下异常: 问题的风险及影响 影响业务流程正常执行,无法获得batch ins…...
软件测试——用例篇(上)
概念 什么是测试⽤例? 测试⽤例(Test Case)是为了实施测试⽽向被测试的系统提供的⼀组集合,这组集合包含:测试环境、操作步骤、测试数据、预期结果等要素 设计测试⽤例原则⼀: 测试⽤例中⼀个必需部分是对…...
Flink中三种模式:YARN Session 模式、YARN Per-Job 模式和 YARN Application 模式提交任务命令
在 Apache Flink 中,YARN 提供了多种模式来提交和管理作业,每种模式都有其独特的特点和适用场景。主要有以下三种模式:YARN Session 模式、YARN Per-Job 模式和 YARN Application 模式。 1. YARN Session 模式 在 YARN Session 模式中,一个长时间运行的 Flink 会话(Sess…...
DBMS-1.2 关系运算
本文章的素材与知识均来自于李国良老师的数据库管理系统课程。 关系代数 一.基本关系代数运算 基本关系代数运算包括:选择、投影、并、差、笛卡尔积、重命名。 1.选择(select) 选择运算用于从关系R中获取满足条件的元组。 (1…...
Python——继承
一、继承 1. 什么是继承? 继承是一种面向对象编程的机制,允许一个类(子类)从另一个类(父类)继承属性和方法。子类可以扩展或修改父类的功能。 2. 如何实现继承? 在Python中,实现…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...
