Spring ApplicationEvent事件处理

Spring的事件

ApplicationEvent以及ListenerSpring为我们提供的一个事件监听、订阅的实现,内部实现原理是观察者设计模式,设计初衷也是为了系统业务逻辑之间的解耦,提高可扩展性以及可维护性。

  • ApplicationEvent就是Spring的事件接口
  • ApplicationListener就是Spring的事件监听器接口,所有的监听器都实现该接口
  • ApplicationEventPublisherSpring的事件发布接口,ApplicationContext实现了该接口

 自定义事件

 定义监控基础业务类

/*** @author Jerry* 监听基础类*/
public class EventModel {
}

定义更新代办接口参数


/*** 更新待办接口* @author Jerry*/
@Data
public class LettersVisitsUpdateTodo extends EventModel {/*** 添加待办记录时返回的待办记录 id*/private String prtcpt_id;/*** 待办记录的标题* 注意:若有传递此字段,且传递值为非空字符串,则会更新覆盖原记录该字段的值*/private String title;/*** 待办事项的状态,枚举值:* "1":处理中* "2":待评价* "3":已完成*   注意:若有传递此字段,且传递值为非空字符串,则会更新覆盖原记录该字段的值*/private String prtcpt_stat;/*** 用户提交待办的时间,即用户创建该待办记录的时间。形式为 yyyy-MM-dd HH:mm:ss ,比如 2018-01-01 12:00:00*  注意:若有传递此字段,且传递值为非空字符串,则会更新覆盖原记录该字段的值*/private String submt_tm;/*** 详情页面链接,仅支持h5跳转和内部小程序页面跳转*  注意:若有传递此字段,且传递值为非空字符串,则会更新覆盖原记录该字段的值*/private String dtl_jump_lnk;
}

定义添加代办接口参数

/*** 添加待办接口参数* @author Jerry*/
@Data
public class LettersVisitsAddTodoDto extends EventModel {/*** 用户身份证号码或其他可登录小程序的证件号码*/private String cert_num;/*** 用户证件号类型,枚举值:* "10":身份证* "14":港澳居民来往内地通行证* "15":台湾居民来往大陆通行证4:问卷调查* "20":护照* "22":港澳台居民居住证* "23":外国人永久居留身份证* "40":其他有效个人身份证件*/private String cert_typ;/*** 即开放平台appid*/private String frgn_id;/*** 业务系统的待办流水号,长度不允许超过64。*  注意:frgn_serial_id 不为空并且重复了,就会增加失败,返回之前的已经插入的待办记录ID*/private String frgn_serial_id;/*** 待办记录的标题*/private String title;/*** 待办记录的业务类型,枚举值* "1":我有话对代表说* "2":基层立法联系点留言* "3":意见征集* "4":问卷调查* "5":人大信访*/private String prtcpt_typ;/*** 待办记录的状态,枚举值*  1":处理中* "2":待评价* "3":已完成*/private String prtcpt_stat;/*** 户提交待办的时间,即用户创建该待办记录的时间。形式为 yyyy-MM-dd HH:mm:ss ,比如 2018-01-01 12:00:00*/private String submt_tm;/*** 详情页面链接,仅支持h5跳转和内部小程序页面跳转*/private String dtl_jump_lnk;
}

定义事件

/*** 专用监听器** @author Jerry*/
@Getter
@Setter
public class YdjApplicationEvent extends ApplicationEvent {private EventModel eventModel;public YdjApplicationEvent(Object source) {super(source);}public YdjApplicationEvent(Object source, EventModel eventModel) {super(source);this.eventModel = eventModel;}
}

事件监听三种方式

实现 ApplicationListener 接口
/*** @author Jerry*/
@Component
public class YdjApplicationListener implements ApplicationListener<YdjApplicationEvent> {@Overridepublic void onApplicationEvent(@NotNull YdjApplicationEvent event) {EventModel eventModel = event.getEventModel();// 这里还可以不仅可以根据类来,还可以设置不同code或者做策略System.out.println(event.getEventModel());}
}
使用@EventListener注解
/*** 处理触发消息发送的事件的handler** @author Jerry*/
@Component
@Slf4j
public class MessageSendEventHandler {@Autowiredprivate YdjApplicationEventServiceImpl ydjApplicationEventService;/***  专用监听器的方法** @param ydjApplicationEvent*/@EventListener(YdjApplicationEvent.class)public void handleYdjApplicationEvent(YdjApplicationEvent ydjApplicationEvent) {EventModel eventModel = ydjApplicationEvent.getEventModel();// 添加待办记录if (eventModel instanceof LettersVisitsAddTodoDto) {ydjApplicationEventService.lettersVisitsAddTodo((LettersVisitsAddTodoDto) eventModel);}// 更新待办记录if (eventModel instanceof LettersVisitsUpdateTodo) {ydjApplicationEventService.lettersVisitsUpdateTodo((LettersVisitsUpdateTodo) eventModel);}}
}
  使用@TransactionalEventListener注解

使用@TransactionalEventListener注解来定义一个监听器

@EventListener@TransactionalEventListener 都是 Spring Framework 提供的注解,用于处理应用程序事件。它们的主要区别在于它们处理事件的时间和事务的关联性。

  • @EventListener:这个注解可以应用于任何方法,使得该方法成为一个事件监听器。当一个事件被发布时,所有标记为 @EventListener 的方法都会被调用,无论当前是否存在一个活动的事务。这意味着 @EventListener 注解的方法可能在事务提交之前或之后被调用。
  • @TransactionalEventListener:这个注解是 @EventListener 的一个特化版本,它允许更精细地控制事件监听器在事务处理过程中的执行时机。@TransactionalEventListener 默认在当前事务提交后才处理事件(TransactionPhase.AFTER_COMMIT),这可以确保事件处理器只在事务成功提交后才被调用。也可以通过 phase 属性来改变事件处理的时机,例如在事务开始前、事务提交前、事务提交后或者事务回滚

注意:此注解需要spring-tx的依赖;

/*** @author Jerry* @date 2024-01-02 15:25*/
@Component
public class DemoListener {@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT, value = {YdjApplicationEvent.class})public void messageListener(YdjApplicationEvent event) {EventModel eventModel = event.getEventModel();System.out.println("DemoListener获取到了监听消息:" + eventModel);}
}

 

 

 这个注解取值有:BEFORE_COMMIT(指定目标方法在事务commit之前执行)AFTER_COMMIT(指定目标方法在事务commit之后执行)、AFTER_ROLLBACK(指定目标方法在事务rollback之后执行)AFTER_COMPLETION(指定目标方法在事务完成时执行,这里的完成是指无论事务是成功提交还是事务回滚了)各个值都代表什么意思表达什么功能,非常清晰需要注意的是:AFTER_COMMIT + AFTER_COMPLETION是可以同时生效的AFTER_ROLLBACK + AFTER_COMPLETION是可以同时生效的

事件发布类

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/593425.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK实现相机掉线自动重连(C#)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK实现相机掉线自动重连&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机的掉线自动重连的技术背景通过PnP事件函数检查Baumer工业相机是否掉线在NEOAPI SDK里实现相机掉线重连方法&#xff1a;工业相机掉线重连测试演示图…

以角色为基础的软件开发团队建设

角色抽象作为一种载体&#xff0c;可以很好地进行软件工程知识体系和企业知识地图的组织&#xff0c;满足企业知识体系持续改进的需要&#xff0c;因此角色团队组建和建设也可以作为软件工程实施方法之一。 软件开发项目立项时&#xff0c;重要工作之一就是开发团队的组建&…

AI计算,为什么要用GPU?

今天这篇文章&#xff0c;我们继续来聊聊芯片。 在之前的文章里&#xff0c;小枣君说过&#xff0c;行业里通常会把半导体芯片分为数字芯片和模拟芯片。其中&#xff0c;数字芯片的市场规模占比较大&#xff0c;达到70%左右。 数字芯片&#xff0c;还可以进一步细分&#xff0…

ECharts配置个性化图表:圆环、立体柱状图

官网调试地址&#xff1a;调试 效果图&#xff1a; 配置&#xff1a; option {color: [#29BEFF, #A2DC00, #FFC400, #FF7F5C, #CA99FC],// 提示窗tooltip: {trigger: item,show: false},// 图例legend: {top: 5%,left: center,show: false},// 数据series: [{name: Access …

LM393典型应用Multisim仿真设计

一、LM393简介: LM393是由两个独立的、高精度电压比较器组成的IC。LM393失调电压低,最大为2.0mv。可以是单电源供电,也可以是双电源供电,供电电压范围比较宽,电源功耗比较低。 LM393主要应用于限幅器、简单的模数转换器、脉冲发生器、方波发生器、延时发生器、宽频…

微同城生活源码系统:专业搭建本地生活服务平台 附带完整的安装部署教程

随着移动互联网的普及&#xff0c;人们越来越依赖手机进行日常生活中的各种活动&#xff0c;包括购物、餐饮、娱乐等。而传统的本地生活服务平台往往存在着功能单一、用户体验差等问题&#xff0c;无法满足用户日益增长的需求。因此&#xff0c;开发一款功能强大、易用性强的本…

css文本溢出处理——单行、多行

日常开发中&#xff0c;经常会遇到需要展示的文本过长&#xff0c;这种情况下&#xff0c;为了提高用户的使用体验&#xff0c;最常见的处理方式就是把溢出的文本显示成省略号。 处理文本的溢出的方式&#xff1a;1&#xff09;单行文本溢出&#xff1b; 2&#xff09;多行文本…

TikTok未来十年:平台发展的前瞻性思考

TikTok&#xff0c;作为全球短视频平台的领军者&#xff0c;已经在数字时代崭露头角。然而&#xff0c;随着技术的飞速发展和用户需求的变化&#xff0c;TikTok未来十年的发展前景充满了挑战和机遇。本文将深入探讨TikTok未来的发展方向&#xff0c;从技术、内容、社交和商业等…

OpenCV-Python(24):模板匹配

原理及介绍 模板匹配是一种常用的图像处理技术&#xff0c;它用于在一幅图像中寻找与给定模板最匹配的区域(在一副大图中搜寻查找模版图像位置的方法)。模板匹配的基本思想是将模板图像在目标图像上滑动&#xff0c;并计算它们的相似度&#xff0c;找到相似度最高的位置即为匹配…

LeetCode做题总结 15. 三数之和(未完)

不会做&#xff0c;参考了代码随想录和力扣官方题解&#xff0c;对此题进行整理。 代码思路 思想&#xff1a;利用双指针法&#xff0c;对数组从小到大排序。先固定一个数&#xff0c;找到其他两个。 &#xff08;1&#xff09;首先对数组从小到大排序。 &#xff08;2&…

2024史上最全的 iOS 各种测试工具集锦!

引言&#xff1a; 随着移动互联网的兴起&#xff0c;APP 测试的越来越被重视&#xff01;Android 系统因为自己的开源性&#xff0c;测试工具和测试方法比较广为流传&#xff0c;但是 iOS 系统的私密性&#xff0c;导致很多测试的执行都有点麻烦。 为了帮助大家更好的执行 iO…

Axure鲜花速递商城网站原型图,花店网站O2O本地生活电商平台

作品概况 页面数量&#xff1a;共 30 页 兼容软件&#xff1a;仅支持Axure RP 9/10&#xff0c;非程序软件无源代码 应用领域&#xff1a;鲜花网、花店网站、本地生活电商 作品特色 本作品为「鲜花购物商城」网站模板&#xff0c;高保真高交互&#xff0c;属于O2O本地生活电…

论文阅读--EFFICIENT OFFLINE POLICY OPTIMIZATION WITH A LEARNED MODEL

作者&#xff1a;Zichen Liu, Siyi Li, Wee Sun Lee, Shuicheng YAN, Zhongwen Xu 论文链接&#xff1a;Efficient Offline Policy Optimization with a Learned Model | OpenReview 发表时间&#xff1a; ICLR 2023年1月21日 代码链接&#xff1a;https://github.com/s…

什么是Maven ??? (以及关于依赖,中央仓库,国内源)

文章目录 什么是 Maven创建第一个 Maven 项目依赖管理Maven 的仓库Maven 如何设置国内源 什么是 Maven Maven &#xff1a;用于构建和管理任何基于java的项目的工具。**说白了就是管理 Java项目 的工具。**我们希望我们已经创建了一些东西&#xff0c;可以使Java开发人员的日常…

鸿蒙HarmonyOS- 弹框组件库

简介 今天介绍一个基于ArkUI框架开发的弹框组件库&#xff0c;该库基于ArkUI的弹框基础功能和自定义能力。针对通用的弹框业务场景&#xff0c;该库提供了丰富的组件弹窗功能。 包括确认输入弹窗、列表展示选择弹窗、自定义底部/顶部弹窗、自定义动画弹窗、自定义全屏弹窗、消息…

nginx访问路径匹配方法

目录 一&#xff1a;匹配方法 二&#xff1a;location使用: 三&#xff1a;rewrite使用 一&#xff1a;匹配方法 location和rewrite是两个用于处理请求的重要模块&#xff0c;它们都可以根据请求的路径进行匹配和处理。 二&#xff1a;location使用: 1&#xff1a;简单匹配…

一键制作电子样册,提升企业品牌形象

​电子样册作为一种新型的宣传方式&#xff0c;具有许多优势。首先&#xff0c;它打破了传统纸质宣传册的局限性&#xff0c;可以随时随地展示企业的产品和服务。其次&#xff0c;电子样册可以通过多媒体形式展示企业的品牌形象&#xff0c;包括图片、视频、文字等多种形式&…

Github 2023-12-31 开源项目日报 Top10

根据Github Trendings的统计&#xff0c;今日(2023-12-31统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量TypeScript项目3Swift项目1Java项目1HTML项目1Astro项目1Python项目1C项目1Dart项目1Jupyter Notebook项目1C项…

Linux/Unix/国产化操作系统常用命令(二)

目录 后CentOS时代国产化操作系统国产化操作系统有哪些常用Linux命令关于Linux的LOGO 后CentOS时代 在CentOS 8发布后&#xff0c;就有了一些变化和趋势&#xff0c;可以说是进入了"后CentOS时代"。这个时代主要表现在以下几个方面&#xff1a; CentOS Stream的引入…

知识库:提升客服效率的利器

相信大家都有过这样的经历&#xff1a;在需要帮助或解决问题时&#xff0c;与客服沟通却遇到了冗长的等待时间、低效的回答和重复的解决方案。这些问题不仅令人沮丧&#xff0c;也给企业带来了巨大的挑战。然而&#xff0c;随着技术的发展&#xff0c;客服系统中的知识库正逐渐…