Spring 内置事件监听-观察者模式

@TransactionalEventListener 事务事件监听进行业务解耦 阅读详情

用来做什么?

当某个业务完成后,需要做另外一些操作。如果写在代码中,一个一个去请求,虽然也能完成,但是这样代码耦合,遇见新增操作也需要找到代码进行修改。

有一种更好的方式,那就是事件监听,事件监听也是设计模式中 发布-订阅模式、观察者模式的一种实现。

可以将业务做完后,发布一个事件,将必须的参数通过事件一同发布出去。发布后所有订阅该事件的监听都会被触发并拿到传递的参数,可以在每个监听中分别进行不同的操作。比如减库存、清购物车等等。

1.定义一个事件,用来发布、提供给监听器去监听。

事件可以简单理解为,对中间参数的传递介质来使用。业务完成后,将各个监听器需要的参数通过有参构造方法进行依赖注入,将DTO传入事件内部,监听器监听到后再从接口中取到DTO实体,再进而取出来参数,完成参数传递。(事件中定义getter方法来供给外部获取DTO)。

/**
 * 事件
 *
 * @author byChen
 * @date 2022/6/15
 */
public class MyUserEvent extends ApplicationEvent {
    /**
     * private私有化封装
     */
    private UserInfo userInfo;

    /**
     * 事件中也可以定义方法
     * 事件中应该定义一个getter方法,这样才能有方法将接口参数获取出来,因为接口参数是private封装起来的
     *
     * @return
     */
    public UserInfo getUserInfo() {
        return this.userInfo;
    }

    /**
     * 有参构造接口,用来传参
     * 事件接口中还可以对这些参数进行统一修改、或者进行一些切面操作。
     *
     * @param source
     */
    public MyUserEvent(UserInfo source) {
        //必要代码行
        super(source);
        //依赖注入
        this.userInfo = source;
        //参数统一处理
        userInfo.setNickName("事件中被创建");
        System.out.println("===MyUserEvent被发布==");
        //切面逻辑
        System.out.println("====切面逻辑===");
    }
}

2.创建监听器来监听事件

创建监听器有两种方法

① 实现ApplicationListener 接口

Object是需要监听的事件的实体,需要重写 onApplicationEvent 方法,监听到事件后就会触发 onApplicationEvent 接口

/**
 * 创建事件监听类,需要实现ApplicationListener接口,指定事件类
 * 当事件被发布时,会触发onApplicationEvent接口,把事件传入接口
 *
 * @author byChen
 * @date 2022/6/15
 */
@Component
public class MyListenerEventTwo implements ApplicationListener<MyUserEvent> {
    @Autowired
    UserInfoService userInfoService;

    /**
     * 监听事件
     *
     * @param event
     */
    @Override
    public void onApplicationEvent(MyUserEvent event) {
        UserInfo userInfo = event.getUserInfo();
        userInfo.setId("2");
        userInfo.setPhone("222222");
        userInfo.setUserName("被监听事件二创建");
        userInfoService.save(userInfo);
    }
}

这种方法不经常使用,一般使用第二种方法

② 使用注解 @EventListener(classes = {Object.class})

使用注解更简便,并且同一Java文件内可以有多个监听事件。对于同一个事件的不同监听,可以使用 **@Order()**注解来指定执行顺序。

/**
 * 使用注解 @EventListener(classes = {MyUserEvent.class})
 * 被该注解修饰的方法,即监听事件的方法。
 *
 * @author byChen
 * @date 2022/6/15
 */
@Component
public class MyListenerEventTwo {
    @Autowired
    UserInfoService userInfoService;

    /**
     * 监听事件一
     *
     * @param event
     */
    @EventListener(classes = {MyUserEvent.class})
    @Order(1)
    public void onApplicationEventOne(MyUserEvent event) {
        UserInfo userInfo = event.getUserInfo();
        userInfo.setId("1");
        userInfo.setPhone("11111");
        userInfo.setUserName("被监听事件一创建");
        userInfoService.save(userInfo);
    }

    /**
     * 监听事件二
     *
     * @param event
     */
    @EventListener(classes = {MyUserEvent.class})
    @Order(2)
    public void onApplicationEventTwo(MyUserEvent event) {
        UserInfo userInfo = event.getUserInfo();
        userInfo.setId("2");
        userInfo.setPhone("222222");
        userInfo.setUserName("被监听事件二创建");
        userInfoService.save(userInfo);
    }
}

3.事件发布(事件广播),监听器触发

事件需要被spring容器发布后,才会被事件给监听到并执行监听器内部逻辑。

现在需要发布的位置注入依赖

    @Autowired
    private ApplicationContext applicationContext;

然后将事件交由依赖来发布

    @GetMapping("/test12")
    @Transactional(rollbackFor = Exception.class)
    public void test() {
        System.out.println("发布事件");
        //通过ApplicationContext 发布事件
        //事件因为有有参构造,因此可以注入参数
        applicationContext.publishEvent(new MyUserEvent(new UserInfo()));
    }

4.监听器监听到,触发执行接口

在这里插入图片描述

注意: 这里面的@Order()注解是spring里面的注解,不要引入错误

事务相关

到这里,事件发布、监听触发就完成了。但是当前发布事件的模块与各个监听模块都位于同一个事务中,因此主发布模块或者监听模块发生异常报错,都是会同步回滚的。

在监听方法上面加上 @Async 异步注解,即可脱离事务管理(启动类需要加上@EnableAsync注解才可以生效异步)。加之前还是相当于同一个线程,不管主业务还是监听,只要一方发生报错,都会回滚。加之后就相当于事务分离开了。

因为指定执行顺序是在一个线程中指定的,因此order注解与Async注解不能同时使用

@Component
public class MyListenerEventTwo {
    @Autowired
    UserInfoService userInfoService;
    
    /**
     * 监听事件
     * 监听事件默认跟发布事件的进程处于同一个事务,
     * 1.加上@Async异步注解,即可脱离事务管理(启动类需要加上@EnableAsync注解才可以生效异步),
     * 加之前还是相当于同一个线程,不管主业务还是监听,只要一方发生报错,都会回滚
     * ps: @EventListener使用该注解可以指定多个事件实体去监听(缺点是入参参数是固定不能改变的)
     * 使用order注解可以指定针对同一事件的监听方法的触发顺序(order注解与Async注解不能同时使用)
     *
     * @param event
     */
    @EventListener(classes = {MyUserEvent.class})
    @Async
    public void onApplicationEventOne(MyUserEvent event) {
        System.out.println("监听器一启动");
        UserInfo userInfo = event.getUserInfo();
        userInfo.setId("1");
        userInfo.setPhone("11111");
        userInfo.setUserName("被监听事件一创建");
        userInfoService.save(userInfo);
    }

    /**
     * 监听事件二
     *
     * @param event
     */
    @EventListener(classes = {MyUserEvent.class})
    @Async
    public void onApplicationEventTwo(MyUserEvent event) {
        System.out.println("监听器二启动");
        UserInfo userInfo = event.getUserInfo();
        userInfo.setId("2");
        userInfo.setPhone("222222");
        userInfo.setUserName("被监听事件二创建");
        userInfoService.save(userInfo);
    }
}

完结

Spring事件监听机制使用和原理解析 如下定义了一个事件AppEvent,它继承了ApplicationEvent类,如果我们要使用Spring的事件监听机制,那么我们定义的事件必须继承ApplicationEvent ,否则就无法使用。java复制代码/*** 功能说明: 事件* * Original @Author: steakliu-刘牌, 2023-03-30 11:02* */ 阅读详情

相关推荐

Spring中的观察者模式——监听模式

总结来说,Spring框架提供了强大的事件驱动编程模型,通过观察者模式(监听模式),我们可以实现对象之间的松耦合和事件的通知机制。在Spring中,通过定义事件类、事件发布器和事件监听器,并在配置文件中进行配置,我们可以很方便地使用观察者模式来实现事件的发布和订阅。观察者模式的核心概念是:存在一个被观察者(Subject),它可以注册多个观察者(Observer),当被观察者的状态发生变化时,它会通知所有观察者进行相应的处理。接下来,我们需要定义一个事件发布器,负责发布事件并通知所有的事件监听器。

2301_79365003的博客 223

Spring观察者模式 - 事件监听机制(发布订阅模式)

一个事件多个处理方式的场景。ApplicationContext中事件处理是由ApplicationEvent类和ApplicationListener接口来提供的。如果一个Bean实现了ApplicationListener接口,并且已经发布到容器中去,每次ApplicationContext发布一个ApplicationEvent事件,这个Bean就会接到通知。Spring事件机制是观察者模式的实现。spring中的事件机制涉

祁_z 1672

SDM量化噪声等效到PLL输出的传递函数推导

在历年文章或书本中少见SDM量化噪声等效到PLL输出的传递函数推导。需了解SDM量化噪声的本质,配合欧拉方程简化,并将Z域转化成S域。最终结合断环处等效到PLL输出的传递函数,方可完成。

u010486560的博客 1406

【Spring框架】Spring监听器的简介和基本使用

本篇文章带你快速了解Spring事件监听器的使用方法和运作模式。

小七的博客 2886

MIKE21桥墩模拟实战:抠网格与构筑物法对比与选型指南

本文详细对比了MIKE21软件中抠网格法与构筑物法在桥墩模拟中的应用,包括操作步骤、适用场景及优缺点分析。通过实际案例数据展示两种方法的精度与效率差异,并提供选型决策树和常见问题解决方案,帮助工程师根据项目需求选择最优模拟方法。

weixin_42656416的博客 322

反激开关电源变压器设计实例讲解(定明芳)

内容来自《反激变压器的设计》(定明芳主讲)。 定名芳老师主要讲了10步,最后应该还有一步,线径的选择已经绕制方式。这里进行了记录整理,把一些公式来源进行了推导。所有的设计都是基于理论计算。 1.确定电源规格 2.确定工作频率和最大占空比 3.计算匝比(利用伏秒平衡原则) 此处插入解释一下伏秒平衡,根源是磁通量平衡。该原则可以用来检查MOS管耐压是否够。 4.计算初级线圈峰值电流 基于CCM模式计算的。ip1是开关管要关闭时的峰值电流,ip2是开关管开始导通时的起始电流。因为时CCM模式,所以,ip

ydgd118的博客 5万+

程序可以同时监听tcp和udp吗?_Spring事件监听机制

本文从JDK的事件机制讲起,再到Spring、SpringBoot的事件机制,并结合源码进行分析,同时给出使用方式。 事件监听机制和设计模式中的观察者模式如出一辙,在Spring框架中被广泛使用。基本概念应用程序事件允许我们发送和接收特定事件,我们可以根据需要处理这些事件。事件用于在松散耦合的组件之间交换信息。由于发布者和订阅者之间没有直接耦合,因此可以在不影响发布者的情况下修改订阅者,反之亦然。...

weixin_39533896的博客 295

【阿里云大模型高级工程师ACP习题集】2.1 用大模型构建新人答疑机器人

【摘要】这是我精心整理出对应的习题集,里面足足有 30 道题目,从基础概念到深度拓展,全方位覆盖章节重点、难点。不管你是想检验自己的学习成果,还是想针对薄弱环节进行强化训练,它都能完美适配!

davidkorhenn的博客 2606

Java设计模式-观察者模式

工程结构 谷歌的观察者模式框架 package jpattern.observer.guava; import com.google.common.eventbus.EventBus; //谷歌的观察者模式框架 public class GuavaEventTest { public static void main(String[] args) { EventBus eve...

pianai_s的博客 254

Android应用开发从零到一:基于Kotlin与Jetpack Compose的完整实践指南

移动应用开发的核心在于构建一个架构清晰、可维护且可扩展的应用基础。理解应用架构的原理,如关注点分离和数据驱动UI,是实现高质量应用的关键技术价值。在现代Android开发中,Kotlin语言凭借其空安全特性和协程,能有效提升代码的健壮性与开发效率。Jetpack Compose作为声明式UI框架,代表了UI开发的未来方向,与Kotlin协程深度集成,简化了复杂交互界面的构建。这些技术共同服务于个人任务管理、企业工具等多种应用场景。本文以构建一个完整的个人任务管理应用为例,系统阐述从环境搭建、UI构建、数据持

weixin_32667955的博客 313

矩阵奇异值分解算法(SVD)的导数 / 灵敏度分析

设矩阵X∈Rm×nX∈Rm×nXUΣV⊤XUΣV⊤U∈Rm×mU∈Rm×m为左奇异向量矩阵;V∈Rn×nV∈Rn×n为右奇异向量矩阵;Σdiag⁡σ1σ2σrΣdiagσ1​σ2​σr​为奇异值对角阵(rrank⁡XrrankX我们关心:当XXX发生微小扰动dXdX时,UΣVUΣV如何变化?dXdUΣV⊤dX。

qq_36812406的博客 1749

Spring中的观察者模式

一、Spring中观察者模式的四个角色 1.事件(ApplicationEvent) ApplicationEvent 是所有事件对象的父类。ApplicationEvent 继承自 jdk 的 EventObject, 所有的事件都需要继承 ApplicationEvent, 并且通过source得到事件源。 下列描述了Spring提供的内置事件: ContextRefreshedEvent:...

weixin_30950887的博客 264

自动驾驶领域自动化数据标注应用

自动驾驶领域自动化数据标注应用 1. 背景介绍 1.1 自动驾驶技术的发展 自动驾驶技术近年来取得了长足的进步,吸引了众多科技公司和传统车企的投入。自动驾驶系统需要感知周围环境、做出决策并控制车辆,是一个极具挑战的任务。其中,环境感知是自

AI天才研究院 2214

Spring事件监听机制

目录1. 使用Spring 事件事件事件监听器事件发布操作2. Spring事件原理原理:观察者模式Spring事件机制源码流程问题Spring事件体系包括三个组件:事件,事件监听器,事件广播器。Spring内置事件内置事件中由系统内部进行发布,只需注入监听器Event说明ContextRefreshedEvent当容器被实例化或refreshed时发布.如调用refresh()方法, 此处的实例化是指所有的bean都已被加载,后置处理器都被激活,所有单例bean都已被实例化, 所有的容器对象都已准备好可使

EverythingAtOnce的博客 1332

基于BEV(鸟瞰图)的3D检测:PointPillars与CenterPoint

基于BEV(鸟瞰图)的3D检测:PointPillars与CenterPoint​ ,人工智能,计算机视觉,大模型,AI,本文围绕基于BEV的3D检测,解析了PointPillars与CenterPoint两种算法。PointPillars用点柱特征编码网络处理点云,通过2D卷积网络提取特征,检测头为解耦头;CenterPoint将三维物体表为点,分两阶段检测,先找中心点及属性,再细化预测。两者都可借特定骨干网生成BEV特征图且基于BEV检测,但检测头设计和物体表示方式不同。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 27万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Spring 事件监听机制介绍以及源码分析

Spring 事件监听机制介绍以及源码分析

weixin_46619605的博客 1514

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

基于ApplicationListener的事件监听机制

一 基本原理 ApplicationListener事件监听机制是经典的观察者设计模式的实现,基本原理就是:通过ApplicationEvent类和ApplicationListener接口,实现ApplicationContext事件处理, 每当ApplicationContext发布ApplicationEvent时,ApplicationListener Bean将自动被触发。这种事件机制都必须需要程序显示的触发。 二 spring内置事件 ContextRefreshedEvent Applic

wwwvipp的博客 556

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Spring Events

Spring 事件体系是观察者模式的典型应用,观察者模式中有主题(Subject)和观察者(Observer),它定义了对象之间的一对多的依赖关系,当主题状态发生变化时,所有观察者都会收到通知并且自动更新. Overview Spring 的事件机制和事件发布是ApplicationContext本身提供的功能,要实现 Spring Events 需要遵循以下几点: 自定义事件必须...

jiangbb8686的博客 364

java 事件类型_Spring框架中有哪些不同类型的事件?

Spring内置事件内置事件中由系统内部进行发布,只需注入监听器自定义事件事件类需要继承ApplicationEvent,代码如下:public class BigEvent extends ApplicationEvent {private String name;public BigEvent(Object source, String name) {super(source);this.n...

weixin_40001967的博客 313

Spring Boot 事件监听机制完整开发指南

Spring Boot 事件监听机制开发指南 摘要:本文全面介绍Spring Boot的事件监听机制,基于观察者模式实现发布-订阅模型。核心组件包括ApplicationEvent、ApplicationListener、ApplicationEventPublisher和ApplicationEventMulticaster。文章详细解析了Spring Boot的生命周期事件触发顺序,从容器初始化前的ApplicationStartingEvent到应用关闭的ApplicationClosedEvent。

python15397的博客 979

Spring 框架——事件监听机制

本文介绍了 Spring 框架中的事件监听机制。

代码星辰的博客 2856

spring|spring event|Spring内置事件驱动编程模型

基于经典的观察者模式实现,当一个组件(发布者)发生了某件重要的事(如用户注册),它只需“广播”一个事件,而无需关心谁会处理。其他对此感兴趣的组件(监听器)可以“订阅”并响应这个事件,彼此互不直接依赖。在Spring 4.2之后,它可以是任何普通的Java对象(POJO),不再强制继承ApplicationEvent类。负责监听并处理特定事件的组件。ApplicationContext 作为“广播器”,会将接收到的事件分发给所有注册的、对该事件类型感兴趣的监听器。监听器接收到事件后,执行其定义好的业务逻辑。

砍材农夫的 博客 229

Spring容器事件与监听器的作用以及实现原理

Spring框架中的容器事件与监听器机制基于观察者模式,用于在容器生命周期或应用状态变化时进行通知和处理。容器事件如ContextRefreshedEvent、ContextClosedEvent等,用于通知容器的初始化、刷新、关闭等关键阶段。事件监听器通过实现ApplicationListener接口或使用@EventListener注解,响应特定事件并执行相应业务逻辑,实现组件解耦和功能扩展。事件发布通过ApplicationEventPublisher接口实现,事件广播器ApplicationEven

几许的博客 1023

java观察者模式的三种实现方式

java观察者模式的三种实现方式

weixin_42145727的博客 1131

Spring Event 业务解耦神器,刷爆了

点击上方“芋道源码”,选择“设为星标”管她前浪,还是后浪?能浪的浪,才是好浪!每天 10:33更新文章,每天掉亿点点头发...源码精品专栏原创 | Java 2021超神之路,很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络应用框架 Netty 源码解析消息中间件 RocketMQ 源码解析数据库中间件 Sharding-JDBC 和 MyCAT ...

芋艿V 277

23种设计模式一观察者模式

观察者模式是一种行为型设计模式,定义了对象间的一对多依赖关系,当被观察者状态变化时自动通知所有观察者。该模式包含被观察者(Subject)和观察者(Observer)两个核心角色,实现松耦合、动态绑定和广播通信。文章介绍了两种实现方式:基于Java内置的Observable/Observer类(已弃用)和更推荐的自定义接口实现。观察者模式广泛应用于框架设计(如Spring事件机制、Vue响应式原理),能提升系统的可维护性、扩展性和可测试性。通过天气监测系统的代码示例,展示了该模式的具体应用场景和工作流程。

J_liaty的博客 1218
上一篇: springBoot集成-注解参数验证@Validated
下一篇: 动态的为实体字段添加注解/注解属性
Adda_Chen
博客等级 码龄7年 1213粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值