Spring Boot Event 观察者模式,轻松带你实现业务解耦!

写在最前

实际业务开发过程中,业务逻辑可能非常复杂,核心业务 + N个子业务。如果都放到一块儿去做,代码可能会很长,耦合度不断攀升,维护起来也麻烦,甚至头疼。还有一些业务场景不需要在一次请求中同步完成,比如邮件发送、短信发送等。

MQ 确实可以解决这个问题,但 MQ 重啊,非必要不提升架构复杂度。针对这些问题,我们了解一下 Spring Event。

Spring Event 同步使用

Spring Event( Application Event)其实就是一个观察者设计模式,一个 Bean 处理完成任务后希望通知其它 Bean 或者说一个 Bean 想观察监听另一个Bean 的行为。

推荐一个 Spring Boot 基础实战教程:

https://github.com/javastacks/spring-boot-best-practice

1.自定义事件

定义事件,继承 ApplicationEvent 的类成为一个事件类

Spring Boot Event 观察者模式,轻松带你实现业务解耦!

2.定义监听器

监听并处理事件,实现 ApplicationListener 接口或者使用 @EventListener 注解

Spring Boot Event 观察者模式,轻松带你实现业务解耦!

3.定义发布者

发布事件,通过 ApplicationEventPublisher 发布事件

Spring Boot Event 观察者模式,轻松带你实现业务解耦!

4.单测执行

Spring Boot Event 观察者模式,轻松带你实现业务解耦!

执行结果如下:

Spring Boot Event 观察者模式,轻松带你实现业务解耦!

Spring Event 异步使用

有些业务场景不需要在一次请求中同步完成,比如邮件发送、短信发送等。

1.自定义事件

Spring Boot Event 观察者模式,轻松带你实现业务解耦!

2.定义监听器

推荐使用 @EventListener 注解

Spring Boot Event 观察者模式,轻松带你实现业务解耦!

3.定义发布者

Spring Boot Event 观察者模式,轻松带你实现业务解耦!

4.单测执行(同步)

Spring Boot Event 观察者模式,轻松带你实现业务解耦!

执行结果如下:

Spring Boot Event 观察者模式,轻松带你实现业务解耦!

5.开启异步

启动类增加 @EnableAsync 注解

Spring Boot Event 观察者模式,轻松带你实现业务解耦!

Listener 类需要开启异步的方法增加 @Async 注解

Spring Boot Event 观察者模式,轻松带你实现业务解耦!

6.单测执行(异步)

发送短信的线程显示 task-1,主线程结束后(总耗时:(2017)毫秒)控制台停止打印了

Spring Boot Event 观察者模式,轻松带你实现业务解耦!

来源:blog.csdn.net/csp732171109/article/details/124377254

近期热文推荐:

  1. 1,000+ 道 Java面试题及答案整理(2022最新版)

  2. 劲爆!Java 协程要来了。。。

  3. Spring Boot 2.x 教程,太全了!

  4. 别再写满屏的爆爆爆炸类了,试试装饰器模式,这才是优雅的方式!!

  5. 《Java开发手册(嵩山版)》最新发布,速速下载!

觉得不错,别忘了随手点赞+转发哦!

Original: https://www.cnblogs.com/javastack/p/16472502.html
Author: Java技术栈
Title: Spring Boot Event 观察者模式,轻松带你实现业务解耦!

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/538961/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 【转】【OPenGL】理解OpenGL拾取模式(OpenGL Picking)

    在用OpenGL进行图形编程的时候,通常要用鼠标进行交互操作,比如用鼠标点选择画面中的物体,我们称之为拾取(Picking),在网上看了很多OpenGL拾取的文章,但大多是只是介绍…

    Java 2023年5月29日
    0122
  • Java(8)数组

    数组 数组存储相同类型值的序列。 声明数组 数组是一种数据结构,用来存储同一类型值的集合。通过一个整型下标(index,或称索引)可以访问数组中的每一个值。例如,如果a是一个整型数…

    Java 2023年6月9日
    088
  • 线程安全,这词你懂了吗?

    前言 还记得你第一次遇到「 线程安全」这个词的时候吗? 我第一次遇到线程安全这个词是在学习多线程并发操作的时候,看到人家文章里出现这个词,还有说各种线程安全的类,但是一开始并不理解…

    Java 2023年6月10日
    081
  • nginx重新整理——————http请求的11个阶段中的precontent阶段[十六]

    前言 简单介绍一下precontent阶段。 正文 介绍一下这个阶段的几个模块。 ngx_http_try_files_module 模块。 syntax : tryfiles f…

    Java 2023年5月30日
    086
  • Redis6.0.6的三大内存过期策略和八大淘汰策略

    一、前言 Redis在我们日常开发中是经常用到的,Redis也是功能非常强大,可以进行缓存,还会有一些排行榜、点赞、消息队列、购物车等等;当然还有 分&amp…

    Java 2023年6月15日
    073
  • 白盒安全测试系列 之 概述

    1.1 前言Java Web安全测试主要分为黑盒测试和白盒测试,黑盒测试是指测试人员不清楚Web具体的架构和实现,通过模拟一个或者多个攻击角色进行渗透攻击,来发现潜在的漏洞和安全风…

    Java 2023年6月7日
    0102
  • mybatis

    基于JDBC的。 public class JDBCDemo { public static void main(String[] args) throws SQLExceptio…

    Java 2023年5月30日
    086
  • Mysql学习笔记-临键锁实验

    前言昨天同事跟我聊到一个问题:InnoDB里面间隙锁锁住的数据可以update么?我们经常都说间隙锁是InnoDB在RR隔离级别下防止幻读的一种处理手段。它可以防止数据在间隙范围中…

    Java 2023年6月5日
    0103
  • Java 求解自幂数(水仙花数)

    什么是自幂数 如果在一个固定的进制中,一个 n 位自然数等于自身各个数位上数字的 n 次幂之和,则称此数为自幂数。 例如:在十进制中,153 是一个三位数,各个数位的3次幂之和为 …

    Java 2023年6月15日
    0100
  • Java多线程并发编程

    多线程并发 在多核CPU中,利用多线程并发编程,可以更加充分地利用每个核的资源 在Java中,一个应用程序对应着一个JVM实例(也有地方称为JVM进程),如果程序没有主动创建线程,…

    Java 2023年6月9日
    090
  • Vue3 封装 Element Plus Menu 无限级菜单组件

    本文分别使用 SFC(模板方式)和 tsx 方式对 Element Plus el-menu 组件进行二次封装,实现配置化的菜单,有了配置化的菜单,后续便可以根据路由动态渲染菜单。…

    Java 2023年6月16日
    079
  • Nginx简单快速搭建文件服务器

    前言 在之前的一篇博文中介绍了Nginx负载均衡的实现,本篇文章就简单介绍下如何用Nginx搭建一个文件服务器。 Nginx安装 在之前的一篇博文中已经讲述过了,这里就不在讲述了。…

    Java 2023年5月30日
    075
  • 集合总结

    2.Collection集合 相同点 都是容器,可以存储多个数据 不同点 数组的长度是不可变的,集合的长度是可变的 数组可以存基本数据类型和引用数据类型 集合只能存引用数据类型,如…

    Java 2023年6月14日
    092
  • SpringBoot异步方法优化处理提高响应速度

    1.前言 日常开发中,对于串行化的任务适当解耦耗时操作和业务逻辑,在保证结果准确性的前提下,使用异步方法适当进行并行化改造,可以提高接口响应速度,提升使用体验。 如下抽象的串行化工…

    Java 2023年5月29日
    090
  • 【力扣】5. 最长回文子串

    给你一个字符串 s,找到 s 中最长的回文子串。 示例 1:输入:s = “babad”输出:”bab”解释:”aba&…

    Java 2023年6月8日
    0139
  • 深入源码解析spring aop实现的三个过程

    Spring AOP的面向切面编程,是面向对象编程的一种补充,用于处理系统中分布的各个模块的横切关注点,比如说事务管理、日志、缓存等。它是使用动态代理实现的,在内存中临时为方法生成…

    Java 2023年5月30日
    0131
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球