探索Spring事件监听机制的奇妙世界

news2024/11/21 0:21:51

文章目录

  • 什么是Spring事件监听机制
  • 主要组件
  • 内置的事件监听类
  • 自定义事件监听类
  • 总结

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。

什么是Spring事件监听机制

Spring事件监听机制是Spring框架中的一种设计模式,主要用于处理应用程序的各种事件。这种机制基于发布-订阅设计模式,允许将业务逻辑解耦,并能更好地组织和管理代码。

使用 Spring 事件监听机制的好处:

  1. 解耦:通过将事件的响应逻辑交给监听器处理,可以将事件源和监听器解耦,降低代码的耦合度。
  2. 可扩展性:可以添加新的监听器来处理新的事件类型,而无需修改原有代码。
  3. 可重用性:相同类型的事件可以在多个地方处理,提高了代码的可重用性。
  4. 异步处理:事件监听机制支持异步处理,可以避免阻塞主线程,提高应用程序的性能。
  5. 事件过滤:可以使用条件筛选需要处理的事件,只对符合条件的事件进行处理。

主要组件

Spring 事件监听机制包括以下几个主要组件:

  1. 事件源(Event Source):事件源是事件的发起者,通常是一个应用程序中的特定组件或服务。当事件源发生特定事件时,会触发事件的发布。
  2. 事件(Event):事件是事件源发出的消息,通常包含与事件相关的数据。事件可以是自定义的类,继承自 Spring 的 ApplicationEvent 类。
  3. 监听器(Listener):监听器是订阅了事件源的事件并负责处理事件的组件。监听器需要实现 Spring 的 ApplicationListener 接口,并指定要监听的事件类型,该接口定义了一个onApplicationEvent方法,用于处理接收到的事件。。
  4. 发布者(Publisher):发布者是负责将事件发布给所有注册的监听器的组件。在 Spring 框架中,可以使用 ApplicationContext的 publishEvent 方法来发布事件。
  5. 应用上下文(ApplicationContext)ApplicationContext是Spring中的一个中心类,它提供了一个将事件发布到监听器的机制。

内置的事件监听类

Spring框架提供了许多内置的事件监听类,用于处理不同的事件。以下是一些常用的Spring事件监听类:

  1. ContextRefreshedEvent:当ApplicationContext被初始化或刷新时触发。可以用来执行在应用程序启动后需要进行的初始化任务。

  2. ContextStartedEvent:当ApplicationContext被启动(调用start()方法)时触发。可以用来执行在应用程序启动后需要进行的特定任务。

  3. ContextStoppedEvent:当ApplicationContext被停止(调用stop()方法)时触发。可以用来执行在应用程序停止前需要进行的清理任务。

  4. ContextClosedEvent:当ApplicationContext被关闭(调用close()方法)时触发。可以用来执行在应用程序关闭前需要进行的清理任务。

  5. RequestHandledEvent:当一个HTTP请求被处理完成后触发。可以用来记录请求的处理信息或进行其他相关操作。

这些只是一些常见的事件监听类,实际上Spring还提供了更多的事件监听类,可以满足不同场景下的需求。开发者也可以自定义事件监听类,继承自ApplicationEvent,以实现自己的特定事件监听逻辑。

Event

自定义事件监听类

自定义事件监听类之前 先来了解一下Spring事件监听机制的基本工作流程:

  1. 定义事件:事件通常是扩展ApplicationEvent的类的对象,它包含有关事件的信息。
  2. 定义监听器:监听器是实现了ApplicationListener接口的类,被定义为处理特定事件类型的类。
  3. 注册监听器:通过将监听器注册到Spring容器中,或者手动添加到ApplicationContext中。
  4. 发布事件:在需要的情况下,通过调用ApplicationContextpublishEvent()方法发布事件,Spring将该事件传递给所有匹配的监听器。

Spring机制基于发布-订阅设计模式,这就像你关注了某个人,他一旦有作品更新,你就能立马收到消息一样。

下面举个例子自定义一个Spring事件监听功能,比如你喜欢波多老师并且关注了她,波多老师一旦发布新电影你就能收到并且观看。具体代码如下:

  1. 定义事件MovieEvent
public class MovieEvent extends ApplicationEvent {

    private String movieName;
    
    public MovieEvent(Actor source , String movieName) {
        super(source);
        this.movieName = movieName;
    }


    public String getMovieName() {
        return movieName;
    }
}
@Data
public class Actor {

    private String name;

}
  1. 定义监听器MovieListener

定义监听器有两种方式,一是实现 ApplicationListener接口,而是使用 @EventListener 注解。下面使用这两种方式分别定义一个监听器。

@Component
public class MovieListener implements ApplicationListener<MovieEvent> {

    @Override
    public void onApplicationEvent(MovieEvent event) {
        Actor actor = (Actor) event.getSource();
        String movieName = event.getMovieName();

        System.out.println("实现类监听器 监听到"+actor.getName()+" 发布了新电影,电影名字叫:"+movieName);
    }
}
@Component
public class MovieListener2 {

    @EventListener
    public void listener(MovieEvent event) {
        Actor actor = (Actor) event.getSource();
        String movieName = event.getMovieName();

        System.out.println("注解监听器 监听到 "+actor.getName()+" 发布了新电影,电影名字叫:"+movieName);
    }
}

@EventListener注解是方法级别的注解,使用它可以在一个类中定义多个监听方法。

  1. 测试事件发布功能
@RunWith(SpringRunner.class)
@SpringBootTest(classes = MqApplication.class)
public class RestTest {

    @Autowired
    private ApplicationEventPublisher applicationEventPublisher;

    @Autowired
    private ApplicationContext applicationContext;

    @Test
    public void testEvent(){
        Actor boDuo = new Actor();
        boDuo.setName("波多老师");

        MovieEvent movieEvent = new MovieEvent(boDuo , "好好学习,别胡思乱想!");
        applicationContext.publishEvent(movieEvent);
    }
}

测试结果:

实现类监听器 监听到波多老师 发布了新电影,电影名字叫:好好学习,别胡思乱想!
注解监听器 监听到 波多老师 发布了新电影,电影名字叫:好好学习,别胡思乱想!

ApplicationContext 继承了 ApplicationEventPublisher ,所以发布事件既可以通过 ApplicationEventPublisher#publishEvent() 方法,也可以通过ApplicationContext#publishEvent() 方法。

通过上面的测试结果可以发现,两个监听类最终都监听到了MovieEvent ,都在控制台打印结果了。
实际上Spring的事件监听机制对于同一个事件的监听是同步的,默认情况下是同步的。当事件被发布时,Spring会依次通知所有监听该事件的监听器,并在事件发布的同一线程中依序执行监听器的处理逻辑。
这意味着,当一个事件被触发后,事件监听器的执行是按照注册的顺序依次进行的,前一个监听器完成后才会执行下一个监听器。只有当所有监听器都执行完毕后,事件发布者才会继续往下执行。

如果想实现异步可以在监听器的方法上添加@Async注解,或在配置文件中进行相应的配置,可以使监听器的处理逻辑在不同的线程中执行,从而实现异步处理。

如果是想实现监听器按照指定顺序执行,可以使用 @Order 注解,@Order注解的值越小,优先级越高,即执行顺序越靠前。

总结

总的来说,Spring事件监听机制使用起来简单方便,可以是组件之间解耦,提高了代码的可维护性和可扩展性。当需要使用监听机制的时候,Spring的事件监听机制是个很好的选择之一。

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

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

相关文章

【网络安全】零日漏洞(0day)是什么?如何防范零日攻击?

零日攻击是利用零日漏洞&#xff08;0day&#xff09;对系统或软件应用发动的网络攻击&#xff0c;近年来&#xff0c;零日攻击威胁在日益增长且难以防范&#xff0c;零日攻击已成为企业网络信息安全面临的最严峻的威胁之一。 文章目录 What is a zero-day attack&#xff1f;…

计算机操作系统4

1.什么是进程同步 2.什么是进程互斥 3.进程互斥的实现方法(软件) 4.进程互斥的实现方法(硬件) 5.遵循原则 6.总结&#xff1a; 线程是一个基本的cpu执行单元&#xff0c;也是程序执行流的最小单位。 调度算法&#xff1a;先来先服务FCFS、短作业优先、高响应比优先、时间片…

用 Bytebase 做数据库 schema 迁移

数据库 schema 迁移指修改管理数据库结构的变更&#xff0c;包括为数据库添加视图或表、更改字段类型或定义新约束。Bytebase 提供了可视化 GUI 方便迁移数据库 schema&#xff0c;本教程将展示如何使用 Bytebase 为 schema 迁移配上 SQL 审核&#xff0c;自定义审批流&#xf…

浅谈城镇老旧小区改造中电动汽车充电桩应用探讨

摘要&#xff1a;《2020 年政府工作报告》指出&#xff1a;加强新型基础设施建设&#xff0c;发展新一代信息网络&#xff0c;拓展 5G 应用&#xff0c;建设数据中心&#xff0c;增加充电桩、换电站等设施&#xff0c;推广新能源汽车&#xff0c;激发新消费需求、助力产业升级。…

【天线了解】2.WTW天线了解与使用

注意网段&#xff1a;&#xff08;计算机与设备同一网段才可以通信&#xff09; 1.LS28接收机使用的网段是192.168.16.X&#xff0c;所以电脑应该同样设置 2.WTW天线使用网段192.168.98.X 0.WTW使用原理 1.计算机控制LS28&#xff08;接收机&#xff09;&#xff0c;WTW天线。 …

面试官:说说webpack proxy工作原理?为什么能解决跨域?

面试官&#xff1a;说说webpack proxy工作原理&#xff1f;为什么能解决跨域? 一、是什么 webpack proxy&#xff0c;即webpack提供的代理服务 基本行为就是接收客户端发送的请求后转发给其他服务器 其目的是为了便于开发者在开发模式下解决跨域问题&#xff08;浏览器安全…

Minio保姆级教程

转载自&#xff1a;www.javaman.cn Minio服务器搭建和整合 1、centos安装minio 1.1、创建安装目录 mkdir -p /home/minio1.2、在线下载minio #进入目录 cd /home/minio #下载 wget https://dl.minio.io/server/minio/release/linux-amd64/minio1.3、minio配置 1.3.1、添加…

为什么越来越多的网站使用https,有什么好处?什么是https加密协议?

首先回答“什么是https加密协议&#xff1f;” HTTPS&#xff08;HyperText Transfer Protocol Secure&#xff09;是一种通过加密传输数据的安全版本的HTTP协议。它使用了SSL&#xff08;Secure Sockets Layer&#xff09;或TLS&#xff08;Transport Layer Security&#xf…

代码混淆技术探究与工具选择

代码混淆技术探究与工具选择 引言 在软件开发中&#xff0c;保护程序代码的安全性是至关重要的一环。代码混淆&#xff08;Obfuscated code&#xff09;作为一种常见的保护手段&#xff0c;通过将代码转换成难以理解的形式来提升应用被逆向破解的难度。本文将介绍代码混淆的概…

LainChain 原理解析:结合 RAG 技术提升大型语言模型能力

摘要&#xff1a;本文将详细介绍 LainChain 的工作原理&#xff0c;以及如何通过结合 RAG&#xff08;Retrieval-Aggregated Generation&#xff09;技术来增强大型语言模型&#xff08;如 GPT 和 ChatGPT 等&#xff09;的性能。我们将探讨 COT、TOT、RAG 以及 LangChain 的概…

千万别碰SLAM,会变得不幸--下阙

0.书接上回 之前的工作内容总结&#xff1a; 1.学习了回环检测的流程&#xff0c;还学习了DLoopDetector算法。 2.修改了vins-mono将匹配和回环到的图片进行保存。 3.找到了一个不是办法的办法来代替pr曲线&#xff0c;指定范围作真值。 4.大致了解了DTW地磁匹配算法&#xff…

SLAM算法与工程实践——SLAM基本库的安装与使用(3):Pangolin库

SLAM算法与工程实践系列文章 下面是SLAM算法与工程实践系列文章的总链接&#xff0c;本人发表这个系列的文章链接均收录于此 SLAM算法与工程实践系列文章链接 下面是专栏地址&#xff1a; SLAM算法与工程实践系列专栏 文章目录 SLAM算法与工程实践系列文章SLAM算法与工程实践…

脉冲压缩及MATLAB仿真

文章目录 前言一、脉冲压缩二、MATLAB 仿真1、LFM 脉冲压缩匹配滤波实现测距①、MATLAB 源码②、仿真结果1) LFM 时域波形2) LFM 频域波形3) 两个未分辨目标的合成回波信号4) 脉冲压缩检测距离 2、去协处理仿真①、MATLAB 源码②、仿真结果1) 未压缩回波信号&#xff0c;3个目标…

白皮书 | 分布式存储发展白皮书(2023)

12月1日&#xff0c;在2023云原生产业大会上&#xff0c;中国信通院云大所联合华为、戴尔科技、IBM等分布式存储产业方阵成员单位共同发布《分布式存储发展白皮书&#xff08;2023年&#xff09;》 一、数据智能的需求 &#xff08;一&#xff09;大模型训练需要海量的非结构…

转转闲鱼链接后台搭建教程+完整版源码

最新仿二手闲置链接源码 后台一键生成链接&#xff0c;后台管理教程&#xff1a;解压源码&#xff0c;修改数据库config/Congig 不会可以看源码里有教程 下载程序&#xff1a;https://pan.baidu.com/s/16lN3gvRIZm7pqhvVMYYecQ?pwd6zw3 后台一键生成链接&#xff0c;后台管理教…

【二分查找】LeetCode2141: 同时运行 N 台电脑的最长时间

作者推荐 贪心算法LeetCode2071:你可以安排的最多任务数目 本文涉及的基础知识点 二分查找算法合集 题目 你有 n 台电脑。给你整数 n 和一个下标从 0 开始的整数数组 batteries &#xff0c;其中第 i 个电池可以让一台电脑 运行 batteries[i] 分钟。你想使用这些电池让 全…

【微软技术栈】发布自己造的轮子 -- 创建Nuget包(分布操作)

目录 1、您的项目 2、创建 .nuspec 文件 3、一张图片胜过一千个拉取请求 4、包括自述文件 MD 文件 5、构建软件包 6、将包部署到 Nuget.Org 7、手动上传软件包 8、自动化和脚本化部署 9、我们如何构建和部署 ErrLog.IO Nuget 包 10、Nuget统计数据 11、最后的思考 创建 Nuget 包…

Hiera实战:使用Hiera实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度&#xff0c;DP多卡&#xff0c;EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…

【XILINX】ERROR:Place:1136 - This design contains a global buffer instance

记录一个ISE软件使用过程中遇到的问题及解决方案。 芯片&#xff1a;spartan6 问题 ERROR:Place:1136 - This design contains a global buffer instance, , driving the net,>, that is driving the following (first 30) non-clock load pins. This is not a recommended…

Word文件如何设置为只读模式

如何将word文档设置为只读模式&#xff0c;都有哪些方法呢&#xff1f;今天给大家分享四个设置方法给大家。 方法一&#xff1a;文件属性 常见的、简单的设置方法&#xff0c;不用打开word文件&#xff0c;只需要右键选择文件&#xff0c;打开文件属性&#xff0c;勾选上【只…