3 分钟快速上手 Spring 事件机制

小伙伴们好呀~ 今天来和大家分享下这个 Spring事件机制

内容概览

9e4d41501988dae7a29ab787f248f1fa.png
image-20210829132019387

原理

434a3801f5ad7de02815e642e32f6ea7.png
image-20210828184103069

这个熟悉 观察者模式 的小伙伴应该一眼就看出来啦~

其实就是个简单版的 发布-订阅模式

有三个核心类👇

  1. 事件 ApplicationEvent

  2. 事件发布器 ApplicationEventPublisher

  3. 事件监听器 ApplicationListener

用途👇

事件发布器发布事件,监听器监听到对应的事件后做出相应的反应~

为什么使用

因为需求也不确定 🙄

场景

领导:想在用户操作完后发个邮件通知下A

我:好的

几天后……

领导:算了,先站内提醒就好了,后面再考虑发短信通知啥的,看看哪个效果好点

我:……好的

一开始我也没用这个事件机制的,没多想就写一起了

后面觉得有点不对劲,才想起来用这招的😄

优点👇

  1. 解耦 可以将业务代码和发邮件,站内提醒,短信等进行分离

  2. 异步通知 不用等待这些事件的完成

  3. 提高扩展性 后面再扩展其他操作也方便多啦

提醒

体量小的系统还可以用,大点的还是直接用消息中间件去解决靠谱

项目实战

13271ba618f4b7d3ed327e3b337a530b.png
image-20210829102043376

功能

根据小伙伴反馈事件去发送短信和邮件

主要源码

一. 小伙伴反馈事件 ReaderFeedbackEvent

5361110aade0a707f68c90e0b4989c8f.png
image-20210829094311899

特点和作用👇

继承 ApplicationEvent ,保存反馈信息的DTO

二. 事件发布器 ReaderFeedbackEventPublisher

39fcc81cf341b5f129a417c79e89d199.png
image-20210829102353506

特点和作用👇

实现 ApplicationEventPublisherAware 这个接口,获取 ApplicationEventPublisher 事件发布器去发布事件

三. 监听 ReaderFeedbackEvent 事件并发送邮件

c8cf95b9e732f6d904b2d5b54715ce4c.png
image-20210829102540185

特点和作用👇

实现 ApplicationListener 这个接口,获取事件中的反馈信息,并发送邮件

四. 当反馈信息有点赞时才发送短信通知😄

d6658838dccf909aafbf0cf65dab4163.png
image-20210829102736577

特点和作用👇

监听器的第二种写法—— 注解 ,比较方便,这里监听并判断是不是点赞,再去发送短信😝

测试

这里直接在 IDEA 中进行测试,

8164ab172bb651bf5444341108ffa1ca.png
image-20210829111125716

效果如下👇

like = false

28d8efdf9d87d67842135ff0bd2b35f7.png
image-20210829111409325

like = true

fd32005cd9ac676b6594698833fc7258.png
image-20210829124910499

收到的短信

3a46dd715a6b0b0bac6d00ee93a6a7c1.png

小结

可以看到功能模块很简单,监听反馈事件,然后去发送短信和邮件~

579d7928c771600290dcc3ae3e41478a.png
image-20210829130532523

这部分代码上传到我的 GitHub 仓库啦 (地址在文末)😝

Spring源码解读

异步/同步

这里我们打个断点,就可以轻易的来到这里啦 👇

9c2a65a024b6133f7dc303f669b6f0c0.png
image-20210829104327436

这个方法在事件多播器 SimpleApplicationEventMulticaster 中,可以看到当有配置这个线程池时,是走异步通知路线的

那怎么调用监听器的呢?

可以看到就这简单3步 ,最后就是回到我们的 onApplicationEvent 方法中去处理的

invokeListener ——> doInvokeListener ——> onApplicationEvent

9a89655d84568cd638873b50bbc7677a.png
image-20210829104759111

最后

活学活用,快去试试叭!😆

本期思维导图如下👇

4481bce35a6d12833872d669b4917529.png
image-20210829132531501

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

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

相关文章

mis dss gis_MIS中的决策支持系统(DSS)

mis dss gisThe Decision Support System is always helpful to management people to take decisions/decisions and finds the key business insights from available information systems. 决策支持系统始终有助于管理人员做出决策/决策,并从可用的信息系统中找到…

使用Grunt构建自动化开发环境

1、准备工作 1)首页确保电脑上网,以及能够访问https://registry.npmjs.org/,因需从此网站中下载安装相应的插件; 2)电脑安装Node.js,Grunt及Grunt插件都是基于node.js运行的;如果你电脑上未装node.js&#…

面试突击66:请求转发和请求重定向有什么区别?

作者 | 磊哥来源 | Java面试真题解析(ID:aimianshi666)转载请联系授权(微信ID:GG_Stone)在 Java 中,跳转的实现方式有两种:请求转发和请求重定向,但二者是完全不同的&…

99%的Java程序员会踩的6个坑

前言作为Java程序员的你,不知道有没有踩过一些基础知识的坑。有时候,某个bug,你查了半天,最后发现竟然是一个非常低级的错误。有时候,某些代码,这一批数据功能正常,但换了一批数据就出现异常了。…

BigDecimal 的 4 个坑,你踩过几个?

背景 一直从事金融相关项目,所以对BigDecimal再熟悉不过了,也曾看到很多同学因为不知道、不了解或使用不当导致资损事件发生。所以,如果你从事金融相关项目,或者你的项目中涉及到金额的计算,那么你一定要花时间看看这篇…

Windows Server 2012 R2 里面如何安装Net Framework 3.5

图示 不要慌,和windows是不一样的,没有问题 下一步 默认即可,下一步 这里面的东西以后会装,先不管,我们今天目的是装 net framework 3.5 选一下 正在安装 如果出错了请参考: http://www.2cto.com/os/201410…

聊聊Java中代码优化的30个小技巧

今天我们一起聊聊Java中代码优化的30个小技巧,希望会对你有所帮助。1.用String.format拼接字符串不知道你有没有拼接过字符串,特别是那种有多个参数,字符串比较长的情况。比如现在有个需求:要用get请求调用第三方接口,…

面试突击69:TCP 可靠吗?为什么?

作者 | 磊哥来源 | Java面试真题解析(ID:aimianshi666)转载请联系授权(微信ID:GG_Stone)相比于 UDP 来说,TCP 的主要特性是三个:有连接、可靠、面向数据流。所谓的“有连接”指的是 …

Java 是值传递还是引用传递?

作者 | 王磊来源 | Java中文社群(ID:javacn666)转载请联系授权(微信ID:GG_Stone)开篇先来曝答案,在 Java 语言中,本质只有值传递,而无引用传递,解释和证明详见…

SpringCloud基于RocketMQ实现分布式事务

前言分布式事务是在微服务开发中经常会遇到的一个问题,之前的文章中我们已经实现了利用Seata来实现强一致性事务,其实还有一种广为人知的方案就是利用消息队列来实现分布式事务,保证数据的最终一致性,也就是我们常说的柔性事务。消…

漫画:怎么证明sleep不释放锁,而wait释放锁?

wait 加锁示例public class WaitDemo {private static Object locker new Object();public static void main(String[] args) throws InterruptedException {WaitDemo waitDemo new WaitDemo();// 启动新线程,防止主线程被休眠new Thread(() -> {try {waitDemo…

就国内某个程序员问答网站的简单的分析

为什么80%的码农都做不了架构师?>>> 一、数据抓取 分析页面数据,设计数据表结构数据只要包含投票、回答数、问题状态、最后谁回答过、浏览数、问题标题、标签,数据样例如下:由于一开只打算爬问题标题,问题…

iOS开发中 常用枚举和常用的一些运算符(易错总结)

1、色值的随机值:#define kColorValue arc4random_uniform(256)/255.0 // arc4random_uniform(256)/255.0; 求出0.0~1.0之间的数字view.backgroundColor [UIColor colorWithRed:kColorValue green: kColorValue blue: kColorValue alpha: 0.5]; 2、定时器的使用&…

明明加了唯一索引,为什么还是产生重复数据?

前段时间我踩过一个坑:在mysql8的一张innodb引擎的表中,加了唯一索引,但最后发现数据竟然还是重复了。到底怎么回事呢?本文通过一次踩坑经历,聊聊唯一索引,一些有意思的知识点。1.还原问题现场前段时间&…

nmap入门之主机发现

2019独角兽企业重金招聘Python工程师标准>>> #主机发现(HOST DISCOVERY) ##仅列出IP,不扫描 nmap -sL 192.168.70.0/24 > nmap_result.txt 2>&1##仅ping扫描,不扫描端口 nmap -sn 192.168.70.0/24##不ping扫…

面试官:为什么ConcurrentHashMap要放弃分段锁?

今天我们来讨论一下一个比较经典的面试题就是 ConcurrentHashMap 为什么放弃使用了分段锁,这个面试题阿粉相信很多人肯定觉得有点头疼,因为很少有人在开发中去研究这块的内容,今天阿粉就来给大家讲一下这个 ConcurrentHashMap 为什么在 JDK8 …

面试突击72:输入URL之后会执行什么流程?

作者 | 磊哥来源 | Java面试真题解析(ID:aimianshi666)转载请联系授权(微信ID:GG_Stone)在浏览器中输入 URL 之后,它会执行以下几个流程:执行 DNS 域名解析;封装 HTTP 请…

面试必备:TCP 经典 15 连问!

TCP协议是大厂面试必问的知识点。整理了15道非常经典的TCP面试题,希望大家都找到理想的offer呀1. 讲下TCP三次握手流程开始客户端和服务器都处于CLOSED状态,然后服务端开始监听某个端口,进入LISTEN状态第一次握手(SYN1, seqx),发…

ISP QoS Lab

ISP QoS Lab1-PQ优先级队列(PQ,Priority Queue)中,有高、中、普通、低优先级四个队列。数据包根据事先的定义放在不同的队列中,路由器按照高、中、普通、低顺序服务,只有高优先级的队列为空后才为中优先级的…

面渣逆袭:JVM经典五十问,这下面试稳了!

引言1.什么是JVM?JVM——Java虚拟机,它是Java实现平台无关性的基石。Java程序运行的时候,编译器将Java文件编译成平台无关的Java字节码文件(.class),接下来对应平台JVM对字节码文件进行解释,翻译成对应平台匹配的机器…