浅析 spring 事件驱动

2023-11-14

1、ApplicationContext.publishEvent 同步还是异步,为什么 ?

先说结论:默认情况下同步的,即事件发布者会阻塞等待事件处理完成。这是因为Spring的设计初衷是为了保证事件的有序处理和事务的一致性。

看下代码实现:

public void multicastEvent(final ApplicationEvent event, @Nullable ResolvableType eventType) {
		ResolvableType type = (eventType != null ? eventType : resolveDefaultEventType(event));
		Executor executor = getTaskExecutor();
		for (ApplicationListener<?> listener : getApplicationListeners(event, type)) {
			if (executor != null) {
				executor.execute(() -> invokeListener(listener, event));
			}
			else {
				invokeListener(listener, event);
			}
		}
}

getTaskExecutor() 默认:org.springframework.core.task.SyncTaskExecutor 

事件发布时遍历所有注册的监听器,调用每个监听器onApplicationEvent 方法进行事件处理

同步怎么改成异步呢?

配置异步任务执行器(AsyncTaskExecutor),将 ApplicationListener 方法执行改为异步执行

@Async // 声明异步执行
    @Override
    public void onApplicationEvent(CustomEvent event) {
        // 异步处理事件
    }
事件驱动带来的好处是什么?

1、松耦合:组件之间的通信通过事件进行,减少了直接依赖关系,提高了系统的灵活性和可扩展性。

2、可扩展性:通过定义事件和监听器接口,可以方便地添加新的事件和监听器,扩展系统的功能。

3、可维护性:事件驱动机制使代码的逻辑结构更清晰,易于理解和维护。

4、模块化开发:不同模块可以独立定义和实现自己的事件监听器,支持模块化开发和组装。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

浅析 spring 事件驱动 的相关文章

随机推荐

  • 数据库基本操作练习

    目录 创建数据库sqlserver test1 使用数据库 创建students表 创建classes表 增加数据 注意主键使用自动增加时必须用0代替 查询 查询所有字段 查询指定字段 使用as给字段起别名 使用as给表起别名 消除重复行
  • 【Python数据分析 - 2】:多个坐标系的绘制

    文章目录 多个坐标系绘制的代码 绘图结果 多个坐标系绘制的代码 本文无过多讲解 大部分为代码 提供了解 import matplotlib pyplot as plt import random 设置字体 plt rcParams font
  • 关于Comparator接口和Comparable接口的对比(实例展示)

    我们首先来看看API上是如何解释的 Comparable接口 该接口对实现它的每个类的对象强加一个整体排序 这个排序被称为类的自然排序 类的compareTo方法被称为其自然比较方法 Collections sort 和Arrays sor
  • 用浏览器打不开eureka,且其他服务连接eureka异常

    原因 没有在eureka服务的启动类上添加 EnableEurekaServer注解
  • 回答一位同学的来信

    由于个人隐私的原因 将这位同学的名字匿掉了 因为事先并未征求该同学的意见就将这封信贴了上来 如果该同学认为我侵犯了你的隐私请及时告知我 我会将这篇文章撤掉 之所以发表这篇文章是因为个人觉得它很有代表性 很有可能别的同学也正在为此事困扰着 希
  • 拦截一切的CoordinatorLayout Behavior

    原文地址 http jcodecraeer com a anzhuokaifa androidkaifa 2016 0224 3991 html 如果没有深入CoordinatorLayout 你注定无法在探索Android Design
  • Kibana环境安装及常用命令

    已成功起飞 将自己进大厂前花4w买的java全套教程 整整300集 现在拿出来分享给大家 拿走不谢 从入门到精通 学会即可就业 哔哩哔哩 bilibili 1 安装包解压 tar zxvf kibana 6 4 3 linux x86 64
  • 服务器虚拟cd,如何在VMware虚拟机上安装CD或DVD数据?

    如何在VMware ESX或ESXi里使用CD安装诸如Windows XP Windows Server或Linux这样的操作系统 知道这些是在新子虚拟机上获取操作系统及其应用的关键 对于我们这些使用了好些年服务器和桌面虚拟化的人来说 这些
  • [Python人工智能] 三十六.基于Transformer的商品评论情感分析 (2)keras构建多头自注意力(Transformer)模型

    从本专栏开始 作者正式研究Python深度学习 神经网络及人工智能相关知识 前一篇文章利用Keras构建深度学习模型并实现了情感分析 这篇文章将介绍Transformer基础知识 并通过Keras构建多头自注意力 Transformer 模
  • Qt之右键菜单实现

    最近在看C GUI Qt4部分其中有个例子对于扩展一个应用程序提供一个上下文菜单 Qt中的部件的弹出菜单 ContextMenu 依据ContextMenuPolicy的值的不同 有四种形式 一 默认菜单 此时 ContextMenuPol
  • Python 10(Socket网络编程 )

    本节内容 Socket介绍 参数介绍 基本实例 Socket实现多连接处理 通过Socket实现简单SSH 通过Socket实现文件传送 Socket网络编程 此部分内容涉及到 计算机网络相关知识 OSI七层网络模型 大概的流程如下 通信实
  • 合肥工业大学编译原理实验一词法分析

    基本思路 词法分析是对输入语句串中一个个单词符号进行分析 最后格式化输出种别码 类型 位置等信息 那么 就可以考虑一次读入一个字符将它们拼接成一个字符串 当碰到空格或者分界符 时 就把前面已读的字符串格式化输出 再输出当前分界符 然后再往后
  • ThreadLocal详解-ThreadLocal这一篇就够了

    ThreadLocal简介 ThreadLocal 用于存储当前线程的变量 对其他线程是隔离 ThreadLocal为每个线程提供 get 或 set 方法来创建独立初始化的变量副本 ThreadLocal实例通常是类中希望将状态与线程相关
  • postgresql学习笔记之归档堆积处理(亲测有用)

    一 跟归档相关的参数 1 查看是否开启归档模式 show archive mode 仅在已完成的wal段进行归档 如果强制归档 归档段文件大小也是16M 2 查看归档相关参数 show archive timeout 超过这个时长就必须归档
  • 《信号与系统学习笔记》—拉普拉斯变换(二)

    注 本博客是基于奥本海姆 信号与系统 第二版编写 主要是为了自己学习的复习与加深 一 用拉普拉斯变换分析与表征线性时不变系统 1 在拉普拉斯变换的范畴内 一般称H s 为系统函数或转移函数 线性时不变系统的很多性质都与系统函数在s平面的特性
  • 基于STM32WIFI远程监控电压电流表(二)电流检测电路

    电流检测电路 电流检测的原理 电流检测电路 1 低侧检测 2 高侧检测 应用电路 电流检测的原理 电路检测电路常用于 高压短路保护 电机控制 DC DC换流器 系统功耗管理 二次电池的电流管理 蓄电池管理等电流检测等场景 对于大部分应用 都
  • Augment Reality(AR)现实增强的原理

    这篇博客将介绍OpenCV Augment Reality AR 增强现实的基础知识 增强现实技术指利用真实世界中的环境 然后通过计算机生成的程序来增强这些环境 从而不断丰富环境 通常 这是通过视觉 听觉和触觉 触觉交互的某种组合来实现的
  • lua调用shell 脚本

    Lua中 os execute可以执行dos命令 但是返回的是系统状态码 默认输出 io popen 也可以执行dos命令 但是返回一个文件 eg 复制代码 代码如下 local t io popen svn help local a t
  • vim编辑器显示与取消行号

    显示行号 set nu 取消显示行号 set nonu
  • 浅析 spring 事件驱动

    1 ApplicationContext publishEvent 同步还是异步 为什么 先说结论 默认情况下同步的 即事件发布者会阻塞等待事件处理完成 这是因为Spring的设计初衷是为了保证事件的有序处理和事务的一致性 看下代码实现 p