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 中,跳转的实现方式有两种:请求转发和请求重定向,但二者是完全不同的&…

python 示例_带有示例的Python列表copy()方法

python 示例列出copy()方法 (List copy() Method) copy() method is used to copy a list, the method is called with this list (current/original list) and returns a list of the same elements. copy()方法用于复制列表,该方法与此列表一起调用(当前/原始列表…

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

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

输出一个数的二进制序列中1的个数(三种方法)

由于这个数有可能是负数&#xff0c;负数在计算机中以补码的方式存储&#xff0c;要求负数的补码中1的个数依然可以正确输出&#xff0c;方法如下&#xff1a;1、定义这个数的变量类型为无符号整型&#xff08;unsigned int&#xff09;代码为include<stdio.h>int count_…

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

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

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

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

python计算连续复利_复利的Python程序

python计算连续复利Given principle amount, rate and time and we have to find the compound interest in Python. 给定原理量&#xff0c;速率和时间&#xff0c;我们必须找到Python的复利 。 计算复利 (Calculate compound interest) To calculate compound interest, we …

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

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

scala 字符串函数_Scala中的字符串chomp(或chop)函数

scala 字符串函数剁或剁弦 (Chop or Chomp string) It is used to chop off the end of line characters. For this Scala has an inbuilt method stripLineEnd. 它用于截断行尾字符。 为此&#xff0c;Scala具有内置方法stripLineEnd 。 Syntax: 句法&#xff1a; string.st…

Linux扩展根分区大小

1、查看当前逻辑卷的分布df -h2、卸载home分区umount /home注意&#xff1a;无法卸载时候&#xff0c;使用以下命令结束进程&#xff1a;fuser -m /home3、调整home分区大小为20Gresize2fs -p /dev/mapper/VolGroup-lv_home 20G4、检查home分区e2fsck -f /dev/mapper/VolGroup-…

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

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

vc++中画线时xor_C ++'xor_eq'关键字和示例

vc中画线时xor"xor_eq" is an inbuilt keyword that has been around since at least C98. It is an alternative to ^ (EXCLUSIVE-OR Assignment) operator and it mostly uses for bit manipulations. “ xor_eq”是一个内置关键字&#xff0c;至少从C 98起就存在…

【学习笔记】java核心技术学习笔记整理

《java核心技术》 花了半天到一天又认真读了一下java核心技术中的类部分&#xff0c;感觉最近编程时候好多迷迷糊糊&#xff0c;“这样对不对呢&#xff0c;试一试。怎么不对呢”这类的迷糊问题原来都早有定义。 main函数必须在主类中 一个class就是一个机器&#xff0c;要使…

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

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

用于数据分析的Python – Pandas

大熊猫 (Pandas) Pandas is an open-source library built on top of NumPy Pandas是建立在NumPy之上的开源库 It allows for fast analysis and data cleaning and preparation 它允许快速分析以及数据清理和准备 It excels in performance and productivity 它在性能和生产力…

1022词法分析实验总结

经过这次词法分析的实验之后&#xff0c;收获良多。弥补了一些知识空洞&#xff0c;以前不懂的知识也弄懂了。 显然这都得力于组员之间的合作与帮助&#xff0c;一人负责编写&#xff0c;其他在旁边给想法同时学习。程序中运用了许多for&#xff0c;if&#xff0c;while等的循环…

SpringCloud基于RocketMQ实现分布式事务

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

c# uri.host_C#| 具有示例的Uri.Host属性

c# uri.hostUri.Host属性 (Uri.Host Property) Uri.Host Property is the instance property of Uri class which used to get host components from URI. This property returns a string value. This property may generate System.InvalidOperationException exception. Uri…