选择 Guava EventBus 还是 Spring Framework ApplicationEvent
文章首发地址

Spring Framework ApplicationEvent
Spring Framework 的 ApplicationEvent 是 Spring 框架提供的一种事件机制,用于实现发布和订阅事件的功能。它基于观察者模式,允许应用程序内的组件之间进行松耦合的通信。
下面是关于 Spring Framework 的 ApplicationEvent 的详解:
- 事件定义: ApplicationEvent 是一个抽象类,用于定义事件。开发人员可以通过继承 ApplicationEvent 类来定义自己的事件,包括事件的数据和其他相关信息。
- 事件发布: 在 Spring 应用程序中,通过 ApplicationEventPublisher 接口的实现类,如 ApplicationContext,来发布事件。开发人员可以调用 publishEvent() 方法并传递自定义事件对象,以触发事件的发布。
- 事件监听: 在应用程序中,可以通过实现 ApplicationListener 接口或使用 @EventListener 注解来订阅事件。ApplicationListener 接口定义了 onApplicationEvent() 方法,用于处理接收到的事件。使用 @EventListener 注解时,需要将监听方法标记为 @EventListener,并指定所监听的事件类型。
- 事件处理顺序: 可以在事件监听器上使用 @Order 注解来指定事件处理的顺序。较小的 @Order 值表示较高的优先级。
- 异步事件处理: Spring 还支持异步的事件处理机制。通过在事件监听器上使用 @Async 注解,可以使事件处理方法在独立的线程中异步执行。
条件事件监听:可以在事件监听器上使用 @Conditional 注解,根据特定的条件来决定是否监听事件。这可以根据应用程序的配置、环境或其他条件来动态选择事件监听器。
Spring Framework 的 ApplicationEvent 提供了一种松耦合的消息传递机制,使各个组件之间可以通过事件进行通信,而不需要直接依赖于彼此。这样可以增强应用程序的可扩展性和可维护性。
通过使用 Spring 的 ApplicationEvent,开发人员可以实现更灵活、可扩展的应用程序架构,并在应用程序中使用事件驱动的编程范式。
Guava EventBus
Guava EventBus是Google的Guava库中提供的一个事件总线库,用于实现发布和订阅事件的功能。它提供了一种简单而有效的机制,用于解耦组件之间的通信。
下面是关于Guava EventBus的详解:
- 发布-订阅模式: Guava EventBus基于发布-订阅模式,允许组件之间通过事件进行通信。组件可以发布事件,而其他组件可以订阅并处理这些事件。
- 注册和订阅: 开发人员可以通过在订阅者类上使用@Subscribe注解来订阅事件。注解可以应用于任何方法,用于指定事件处理方法。
- 事件发布: 在应用程序中,通过调用EventBus的post()方法来发布事件。发布的事件将会被分发给所有已注册的订阅者,订阅者将根据事件类型来决定是否处理事件。
- 事件处理: 订阅者类中的事件处理方法将被自动调用,以处理接收到的事件。方法的参数可以是事件对象本身或包含事件数据的自定义对象。
- 多个事件处理器: 每个事件可以有多个事件处理器。当事件被发布时,所有订阅该事件的事件处理器将会依次调用。
- 异步事件处理: Guava EventBus支持异步的事件处理。通过在事件处理方法上使用@AllowConcurrentEvents注解,可以将事件处理放在独立的线程中执行,提高应用程序的性能。
- 自定义线程池: Guava EventBus允许开发人员自定义线程池来处理事件。可以通过重写EventBus的executor()方法来指定自定义的线程池。
- 事件过滤: Guava EventBus支持事件过滤器,开发人员可以通过在订阅者方法上使用@Subscribe注解的filter()属性来定义事件过滤器。
Guava EventBus提供了一种轻量级、简单易用的事件通信机制。它适用于各种场景,包括模块化系统、解耦组件、事件驱动架构等。通过使用Guava EventBus,开发人员可以实现组件之间的松耦合,提高应用程序的可维护性和可扩展性。
EventBus 对比 ApplicationEvent
Guava EventBus和Spring Framework的ApplicationEvent是两种不同的事件机制,各有其特点和适用场景。下面是对它们进行比较的一些要点:
- 功能和用途:
Guava EventBus:Guava EventBus是一个轻量级的事件总线库,提供了基于发布/订阅模式的事件处理机制。它适用于简单的事件通信和解耦组件之间的通信。Guava EventBus可以在任何Java应用程序中使用,不限于Spring项目。
Spring Framework的ApplicationEvent:Spring的ApplicationEvent是Spring框架内置的事件机制,用于支持应用程序内各个组件之间的事件通信。它是基于观察者模式的,适用于Spring应用程序中的事件驱动架构。 - 集成和依赖:
Guava EventBus:Guava EventBus是一个独立的库,可以单独引入和使用,不需要其他依赖。它提供了自己的API和配置方式。
Spring Framework的ApplicationEvent:ApplicationEvent是Spring框架的一部分,如果要使用ApplicationEvent,需要引入Spring框架的相关依赖。它与Spring的IoC容器和其他功能紧密集成,可以方便地与Spring应用程序的其他组件进行交互。 - 功能扩展和灵活性:
Guava EventBus:Guava EventBus提供了一些高级功能,如多个事件处理器的注册、异步事件处理、自定义线程池等。这使得它具备一定的灵活性和可扩展性。
Spring Framework的ApplicationEvent:Spring框架的ApplicationEvent可以与Spring的其他功能集成,如AOP、事务管理等。它提供了更丰富的配置选项和更高级的功能,例如条件事件监听、异步事件处理、事件广播等。 - 社区支持和文档资源:
Guava EventBus:Guava EventBus拥有较大的社区支持和活跃的用户群体,有丰富的文档和示例代码可供参考。
Spring Framework的ApplicationEvent:Spring框架是非常流行的Java开发框架,拥有广泛的社区支持和丰富的文档资源。
根据具体的需求和项目背景,可以选择适合的事件机制。如果只需要简单的事件通信和解耦,Guava EventBus是一个轻量级的选择。如果正在开发Spring应用程序,或者需要与Spring框架的其他功能集成,那么可以使用Spring的ApplicationEvent来实现事件驱动的架构。
相关文章:
选择 Guava EventBus 还是 Spring Framework ApplicationEvent
文章首发地址 Spring Framework ApplicationEvent Spring Framework 的 ApplicationEvent 是 Spring 框架提供的一种事件机制,用于实现发布和订阅事件的功能。它基于观察者模式,允许应用程序内的组件之间进行松耦合的通信。 下面是关于 Spring Frame…...
Linux下go环境安装、环境配置并执行第一个go程序
一、安装 1.Golang对Linux的内核版本要求 GO对Linux内核版本最低要求是 2.6.23,对应要求操作系统版本是: RHEL 6.0CentOS 6.0即,不支持 (RHEL 和 CentOS) 的 (4.x or 5.x)。2.下载golang的代码版本 Golang的官网下载地址:https:…...
自定义Dynamics 365实施和发布业务解决方案 - 5. 高级自定义
本章的目的是探索可应用于Dynamics365的高级自定义。这包括使用插件和自定义工作流活动实现复杂的业务流程。此外,您还将了解如何使用SPKL任务运行器来部署这些,这在第2章中进行了讨论。最后,您还将看到使用Web API查询数据。 准备工作 若要从高级自定义开始,必须首先创建…...
软件测试下的AI之路(2)
😏作者简介:博主是一位测试管理者,同时也是一名对外企业兼职讲师。 📡主页地址:【Austin_zhai】 🙆目的与景愿:旨在于能帮助更多的测试行业人员提升软硬技能,分享行业相关最新信息。…...
前端面试的话术集锦第 7 篇:高频考点(浏览器渲染原理 安全防范)
这是记录前端面试的话术集锦第七篇博文——高频考点(浏览器渲染原理 & 安全防范),我会不断更新该博文。❗❗❗ 1. 浏览器渲染原理 注意:该章节都是⼀个⾯试题。 1.1 渲染过程 1.1.1 浏览器接收到HTML⽂件并转换为DOM树 当我们打开⼀个⽹⻚时,浏览器都会去请求对应的…...
打印剪刀手“耶”(V形)
用给定单个字符和首行宽度(奇数), 打印首行宽度为给定奇数“V”字形状)。 (本笔记适合Py 推崇的插件字符串格式化的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free:大咖免费“圣经”教程《 python 完全…...
eNSP基本命令大全
单交换机VLAN划分 进入系统视图 system 进入系统视图 system-view 退到系统视图 quit 删除vlan 20 undo vlan 20 交换机命名 sysname 显示vlan disp vlan 创建vlan(也可进入vlan 20) vlan 20 把端口1-5放入VLAN 20 中 port e1/0/1 to e1/0/5 显示vlan里的端口20 disp v…...
java并发编程 ConcurrentLinkedQueue详解
文章目录 1 ConcurrentLinkedQueue是什么2 核心属性详解3 核心方法详解3.1 add(E e)3.2 offer(E e)3.3 poll()3.4 size()3.5 并发情况分析 4 总结 1 ConcurrentLinkedQueue是什么 ConcurrentLinkedQueue是一个无界的并发队列,和LinkedBlockingQueue相比,…...
msvcp110.dll是什么意思与msvcp110.dll丢失的解决方法
电脑突然提示msvcp110.dll丢失,无法执行此代码。导致软件无法打开运行,这个怎么办呢?我在网上找了一天的资料,终于把这个问题彻底处理好,也弄清楚了msvcp110.dll丢失的原因及msvcp110.dll丢失修复方法?现在…...
八)Stable Diffussion使用教程:MultiDiffusion
multidiffusion,它可以实现图片从 512 像素到 2K、4K 甚至 6K 画质的飞跃。 插件安装步骤: 1)选择扩展 2)选择可用,点击加载按钮 3)找到multidiffusion,点击右侧安装按钮 安装插件后可以在文生图和图生图的出图参数中看到多了两个区域,其实这个插件是由两部分组成的,…...
java通过钉钉机器人发消息
钉钉自定义机器人使用 加签的配置 发送消息 注意:内部群才可以创建自定义机器人 钉钉网址-自定义机器人创建 1、获得的钉钉配置信息workhook和secret //url路径private String URL "https://oapi.dingtalk.com/robot/send?access_token08ebaa04f98f7faacb…...
Git工具本地管理总结
一、本地仓库创建 https://blog.csdn.net/heshuangzong/article/details/125882372 https://blog.csdn.net/l7077/article/details/130270914 在本地创建/home/test目录,作为本地仓库目录。 $ mkdir /home/test $ cd /home/test 初始化本地的git 仓库。 $ git init Initial…...
单片机C语言实例:13、看门狗
一、看门狗溢出测试 程序实例1: #include<reg52.h>sfr WDTRST 0xA6; sbit key P3^1; /*------------------------------------------------喂狗 ------------------------------------------------*/ void Rst_Watchdog( void ) {WDTRST 0x1E…...
时序分解 | MATLAB实现基于SSA奇异谱分析的信号分解分量可视化
时序分解 | MATLAB实现基于LMD局部均值分解的信号分解分量可视化 目录 时序分解 | MATLAB实现基于LMD局部均值分解的信号分解分量可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 奇异谱分解奇异谱分析SSA 可直接替换txt数据运行 Matlab 1.包含3D分解效果图 频谱图等…...
mysql报错:Duplicate entry ‘...‘ for key ‘field‘
错误信息 "Duplicate entry ... for key field" 表示在数据库表中,你正在尝试插入一条数据的number字段的值已经存在。这通常是由于你设置了field字段为唯一键(UNIQUE KEY),而你又尝试插入一个已存在的值。 解决这个问…...
什么是回流跟重绘?从中怎么优化网页性能?
目录 一、什么是回流? 二、什么是重绘? 三、如何触发回流和重绘?会带来什么问题? 四、如何减少回流和重绘的影响? 在前端开发中,回流(reflow)和重绘(repaint…...
Redis事务机制
Redis 是一款开源的、内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。在日常的使用中,我们经常会遇到需要一次执行多个命令,并且这些命令要么全部成功,要么全部失败的场景。这就需要用到 Redis 的事务机制。 Redi…...
[EROOR] SpringMVC之500 回调函数报错
首先,检查一下idea里面的报错的原因,我的是jdk的版本的问题。所以更换一下就可以了。...
[Linux]文件系统
[Linux]文件系统 文件系统是操作系统的一部分,负责组织、存储和管理存储在外部设备上的文件和目录,也就是操作系统管理外设中的文件的策略。本文讲解的是Ext2文件系统。Linux操作系统使用的就是Ext系列的文件系统。 文章目录 [Linux]文件系统了解磁盘结构…...
常见面试题记录
记录下java的常见面试题 文章目录 记录如下 记录如下 记录如下 hashmap原理lock原理synchronized锁优化过程线程状态以及创建方式线程池(执行过程,参数,淘汰策略)jvm(gc优化和OOM)volatile(可见…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...
Ubuntu系统多网卡多相机IP设置方法
目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机,交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息,系统版本:Ubuntu22.04.5 LTS;内核版本…...
算术操作符与类型转换:从基础到精通
目录 前言:从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符:、-、*、/、% 赋值操作符:和复合赋值 单⽬操作符:、--、、- 前言:从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...
