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中,实现…...
华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...
PostgreSQL——环境搭建
一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在࿰…...
Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)
引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅
目录 前言 操作系统与驱动程序 是什么,为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中,我们在使用电子设备时,我们所输入执行的每一条指令最终大多都会作用到硬件上,比如下载一款软件最终会下载到硬盘上&am…...
鸿蒙(HarmonyOS5)实现跳一跳小游戏
下面我将介绍如何使用鸿蒙的ArkUI框架,实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...
