当前位置: 首页 > news >正文

Spring事件快速上手

文章目录

      • 应用场景
      • 核心接口
      • 使用步骤
      • 异步事件
      • 事件排序

  Spring 事件(Application Event)是 Spring 框架中实现观察者模式的一种方式,可以通过发布者和监听器来处理事件,常用于类之间解耦合、异步操作。

  观察者模式:观察者模式(委托和事件)——老板来了我不知道


应用场景

  举例几个具体的使用场景:

  • 用户注册后发送欢迎邮件:用户注册成功后,可以发布一个事件,由监听该事件的邮件服务来发送欢迎邮件。
  • 订单处理:订单创建后,可以发布一个事件,由库存管理、支付处理、物流跟踪等不同的服务来监听和处理。
  • 数据变更通知:当数据库中的数据发生变化时,可以发布一个事件,由需要这些数据的其他服务来更新缓存或执行其他逻辑。
  • 日志记录和监控:在关键操作执行时,可以发布事件来进行日志记录或监控,而不需要在业务逻辑中直接调用日志服务。

核心接口

  1. ApplicationEvent:所有事件的父类,继承自 java.util.EventObject
  2. ApplicationListener:用于监听事件的接口,它定义了一个 onApplicationEvent(E event) 方法,当有事件发布时,该方法会被调用。
  3. ApplicationEventPublisher:用于发布事件的接口,通常由 Spring 容器实现。
  4. ApplicationEventMulticaster:用于管理事件监听器的注册和事件的广播。

使用步骤

  1. 定义事件:创建一个继承自 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;}
    }
    
  2. 注册监听器

    1. 创建一个实现 ApplicationListener 接口的类。
    @Component
    public class CustomEventListener implements ApplicationListener<CustomEvent> {@Overridepublic void listener(CustomEvent event) {System.out.println("监听到事件发生啦- " + event.getMessage());}
    }
    
    1. 或者使用@EventListener,不必实现 ApplicationListener 接口,在任何 Spring 管理的 bean 上直接声明事件监听方法。
    @Component
    public class CustomEventListener {@EventListenerpublic void listener(CustomEvent event) {System.out.println("监听到事件发生啦- " + event.getMessage());}
    }
    
    1. 指定条件:如果需要根据条件来决定是否调用监听器方法,可以在 @EventListener 注解中使用 condition 属性。
    @EventListener(condition = "#event.message.contains('important')")public void listener(CustomEvent event) {System.out.println("监听到事件发生啦- " + event.getMessage());}
    
  3. 发布事件:通过自动注入 ApplicationEventPublisher 来发布事件。

    @Component
    public class CustomEventPublisher {@Autowiredprivate final ApplicationEventPublisher publisher;public void publishCustomEvent(String message) {CustomEvent customEvent = new CustomEvent(this, message);publisher.publishEvent(customEvent);  //把消息装进事件中}
    }
    
  4. 配置和运行:确保以上组件被 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 事件&#xff08;Application Event&#xff09;是 Spring 框架中实现观察者模式的一种方式&#xff0c;可以通过发布者和监听器来处理事件&#xff0c;常用于类之间解耦合、异步操作。 观察者模式&#xff1a;观察者…...

java算法递归算法练习-数组之和

简单找个题目练习一下递归算法&#xff0c;输入一组数组&#xff0c;使用递归的方法计算数组之和。其实这个题目&#xff0c;用循环的方式也很简单就能解决&#xff0c;直接循环遍历一下相加就行了&#xff0c;但是我们用来练习一下递归。 先来找基线条件和递归条件 基线条件…...

在kdevelop中运行程序并调试

补充前序知识&#xff1a; 1.CMakeLists.txt文件中&#xff0c;如下图&#xff0c;第一行生成的是静态库文件&#xff08;我们前一讲所使用的&#xff09;&#xff0c;第二行是动态库文件。 静态库与动态库&#xff1a; 静态库&#xff08;Static Libraries&#xff09; 定义…...

MySQL数据库-SQL编程

一、触发器 1.触发器简介 触发器&#xff08;trigger&#xff09;是一个特殊的存储过程&#xff0c;它的执行不是由程序调用&#xff0c;也不是手工启动&#xff0c;而是由事件来触发&#xff0c;比如当对一个表进行操作&#xff08; insert&#xff0c;delete&#xff0c; u…...

TypeError: Components is not a function

Vue中按需引入Element-plus时&#xff0c;报错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-平台属性-销售属性维护

公用之前的接口&#xff0c;改下入参&#xff1a;...

使用Leaflet GeoMan结合天地图进行自由标绘实战

目录 前言 一、Leaflet GeoMan是什么 1、关于Leaflet GeoMan 2、关于开源版和企业版 3、相关的方法介绍 二、使用Geoman来进行自由标绘实战 1、相关资源准备 2、新建html网页 3、初始化地图及绑定Geoman控件 三、自由标绘的成果 1、整体效果 2、添加空间对象 3、开…...

Flutter自定义通用防抖的实现

在前端项目开发中&#xff0c;点击事件的防抖是一个永远无法错开的点&#xff0c;特别是针对一些复杂的业务场景&#xff0c;如果不做好防抖操作&#xff0c;就会导致页面或功能触发多次&#xff0c;引发异常或闪退。 在Flutter中可以通过扩展函数的特性 对Function增加全局扩…...

C# Unity 面向对象补全计划 之 继承(字段与属性)

本文仅作学习笔记与交流&#xff0c;不作任何商业用途&#xff0c;作者能力有限&#xff0c;如有不足还请斧正 本系列旨在通过补全学习之后&#xff0c;给出任意类图都能实现并做到逻辑上严丝合缝 Q&#xff1a;为什么要单讲继承字段与属性&#xff0c;不讲继承方法了吗&#x…...

leetcode202. 快乐数,双指针法巧用

leetcode202. 快乐数 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。 然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到 1。 如果这个过程…...

基于Cobbler实现多版本系统批量部署

一、实验题目 基于Cobbler实现多版本操作系统的批量部署。 二、实验目的 掌握Cobbler服务器的安装与配置方法。 学会使用Cobbler进行多版本操作系统的批量部署。 理解PXE网络启动原理及其在操作系统部署中的应用。 提高在实际生产环境中快速部署和管理操作系统的能力。 …...

一投就中不是梦,录取率>80%,最快1个月就见刊,计算机沾边就收,认可度还不低

本次模术狮精心整理5本期刊&#xff0c;最快1个月就见刊&#xff0c;计算机沾边就收&#xff0c;认可度还不低&#xff01; 1 Knowledge-Based Systems ▲ 图片来源&#xff1a;Knowledge-Based Systems官网 期刊简介&#xff1a;《Knowledge-Based Systems》是人工智能领域的…...

【课程系列06】某乎AI大模型全栈工程师-第6期

网盘链接 链接&#xff1a;https://pan.baidu.com/s/1QLkRW_DmIm1q9XvNiOGwtQ --来自百度网盘超级会员v6的分享 课程目标 【知乎大模型课程】学习的四个维度 &#x1f449;指挥层&#xff1a;学高阶指令工程 AI编程等&#xff0c;指挥大模型完成90%代码任务&#xff0c;包…...

Prompt——3分钟掌握,润色论文的7条经典指令。帮助很大,一定要看!

这是一篇帮助你润色论文的ChatGPT指令合集&#xff0c;整理了润色过程中语法优化、审阅校对、专业风格等7个主要方面。 建议收藏&#xff0c;需要的时候直接CtrlV即可&#xff0c;一定对你科研有所帮助~ 1. 修复语法和句法 第一个提示是修复语法和句法。这是任何写作的关键部…...

ARM学习(31)编译器对overlay方式的支持

ARM学习&#xff08;31&#xff09;编译器对overlay方式的支持 1、overlay介绍 overlay&#xff1a;重叠得意思&#xff0c;就是可以重复利用得空间&#xff0c;一般在内存上使用这种空间。比如以Windows操作系统为例&#xff0c;其存储空间&#xff08;ROM/FLASH&#xff09;…...

【YashanDB知识库】yasdb jdbc驱动集成BeetISQL中间件,业务(java)报autoAssignKey failure异常

问题现象 BeetISQL中间件版本&#xff1a;2.13.8.RELEASE 客户在调用BeetISQL提供的api向yashandb的表中执行batch insert并将返回sequence设置到传入的java bean时&#xff0c;报如下异常&#xff1a; 问题的风险及影响 影响业务流程正常执行&#xff0c;无法获得batch ins…...

软件测试——用例篇(上)

概念 什么是测试⽤例&#xff1f; 测试⽤例&#xff08;Test Case&#xff09;是为了实施测试⽽向被测试的系统提供的⼀组集合&#xff0c;这组集合包含&#xff1a;测试环境、操作步骤、测试数据、预期结果等要素 设计测试⽤例原则⼀&#xff1a; 测试⽤例中⼀个必需部分是对…...

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 关系运算

本文章的素材与知识均来自于李国良老师的数据库管理系统课程。 关系代数 一.基本关系代数运算 基本关系代数运算包括&#xff1a;选择、投影、并、差、笛卡尔积、重命名。 1.选择&#xff08;select&#xff09; 选择运算用于从关系R中获取满足条件的元组。 &#xff08;1…...

Python——继承

一、继承 1. 什么是继承&#xff1f; 继承是一种面向对象编程的机制&#xff0c;允许一个类&#xff08;子类&#xff09;从另一个类&#xff08;父类&#xff09;继承属性和方法。子类可以扩展或修改父类的功能。 2. 如何实现继承&#xff1f; 在Python中&#xff0c;实现…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...