没错,这就是 SpringBoot Event的工作原理!

SpringBoot 实现异步事件Event 场景 很多时候当我们完成某些业务后需要给用户推送相关消息提醒。对于这种非核心业务功能我们可以拿出来,创建一个事件去异步执行,从而实现核心业务和子业务的解耦。 实现 定义事件类 Event 创建一个类,继承ApplicationEvent,并重写构造函数。ApplicationEvent是Spring提供的所有应用程序事件扩展类。 public class NoticeEvent extends A... 阅读详情
AI摘要

本文详细探讨Spring Boot事件机制,介绍其原理、核心类与结构,阐述事件发布与处理过程,分析源码中事件发布流程、多播器处理和监听器排序。还提及该机制解耦合、扩展性强、可异步处理的优势,列举用户登录等使用场景,助力项目提升可维护性与扩展性。

这篇文章,我们来详细探讨 Spring Boot 的事件机制的原理、核心源码分析,以及如何在实际开发中使用事件机制。

1. 事件机制是什么?

事件机制是一种设计模式,通过发布/订阅模式来实现组件之间的解耦。在 Spring 中,事件机制主要通过 ApplicationEvent 和 ApplicationListener 来实现,而 Spring Boot 继承了这一机制,提供了更加简化的使用方式。

1.1 主要组成部分

  • 事件(Event):表示一个具体的事件,通常是继承自 ApplicationEvent。
  • 事件监听器(Listener):实现了 ApplicationListener 接口的类,用于处理特定的事件。
  • 事件发布者(Publisher):负责发布事件的组件,通常是 Spring 容器本身。

2. 核心类与结构

在 Spring 和 Spring Boot 中,事件机制的核心类包括:

  1. ApplicationEvent:所有事件的基类。
  2. ApplicationListener:事件监听器的接口。
  3. ApplicationEventPublisher:事件发布的接口。
  4. SimpleApplicationEventMulticaster:事件多播器,用于发布事件给多个监听器。

2.1 ApplicationEvent

public abstract class ApplicationEvent extends EventObject {
    private final long timestamp;

    public ApplicationEvent(Object source) {
        super(source);
        this.timestamp = System.currentTimeMillis();
    }

    public long getTimestamp() {
        return timestamp;
    }
}

所有的事件都需要继承自 ApplicationEvent,它的构造函数中需要传入事件源(即事件的发生者)。

2.2 ApplicationListener

public interface ApplicationListener<T extends ApplicationEvent> {
    void onApplicationEvent(T event);
}

该接口允许用户定义自己的事件处理逻辑。

2.3 ApplicationEventPublisher

public interface ApplicationEventPublisher {
    void publishEvent(ApplicationEvent event);
}

该接口用于发布事件,每个 Spring 容器都是一个事件发布者。

2.4 SimpleApplicationEventMulticaster

public class SimpleApplicationEventMulticaster implements ApplicationEventMulticaster {
    private final List<ApplicationListener<?>> listeners = new ArrayList<>();

    @Override
    public void addApplicationListener(ApplicationListener<?> listener) {
        listeners.add(listener);
    }

    @Override
    public void multicastEvent(ApplicationEvent event) {
        for (ApplicationListener<?> listener : listeners) {
            listener.onApplicationEvent(event);
        }
    }
}

SimpleApplicationEventMulticaster 是 Spring 默认的事件多播器,通过维护一个监听器的列表来完成事件的发布。

3. 事件的发布与处理过程

事件的处理过程通常分为以下几个步骤:

  1. 创建事件:开发者定义具体的事件类,继承自 ApplicationEvent。
  2. 创建监听器:实现 ApplicationListener 接口,处理具体事件。
  3. 注册监听器:在 Spring 上下文中注册监听器。
  4. 发布事件:在需要的地方发布事件。

3.1 自定义事件

public class MyEvent extends ApplicationEvent {
    private String message;

    public MyEvent(Object source, String message) {
        super(source);
        this.message = message;
    }

    public String getMessage() {
        return message;
    }
}

3.2 自定义监听器

@Component
public class MyEventListener implements ApplicationListener<MyEvent> {
    @Override
    public void onApplicationEvent(MyEvent event) {
        System.out.println("Received event: " + event.getMessage());
    }
}

3.3 发布事件

@Component
public class MyEventPublisher {
    @Autowired
    private ApplicationEventPublisher applicationEventPublisher;

    public void publish(String message) {
        MyEvent event = new MyEvent(this, message);
        applicationEventPublisher.publishEvent(event);
    }
}

3.4 事件的注册与监听

在 Spring Boot 中,组件可以通过 @Component 注解自动注册到 Spring 容器中,Spring 会在启动时自动扫描到 @EventListener 注解的方法并注册。

@Component
public class MyEventListener {
    @EventListener
    public void handleEvent(MyEvent event) {
        System.out.println("Handled event: " + event.getMessage());
    }
}

4. Spring Boot事件机制的优势

  1. 解耦合:通过事件机制,组件之间可以相互独立,不需要直接引用。
  2. 扩展性:可以方便地添加新的事件和监听器,实现功能扩展。
  3. 异步处理:可以结合异步机制,处理耗时的事件而不阻塞主线程。

5. 源码分析

为了深入理解事件机制的实现,我们需要查看具体的源码。以下是核心功能的分析:

5.1 事件的发布流程

在 ApplicationContext 中,可以找到事件发布的实现:

public void publishEvent(ApplicationEvent event) {
    if (event == null) {
        throw new IllegalArgumentException("Event must not be null");
    }
    // 推送到 ApplicationEventMulticaster
    getApplicationEventMulticaster().multicastEvent(event);
}

这种设计中,ApplicationContext 通过 ApplicationEventMulticaster 将事件发布给所有感兴趣的监听器。

5.2 多播器的处理

在 SimpleApplicationEventMulticaster 中,事件的多播逻辑如下:

@Override
public void multicastEvent(ApplicationEvent event) {
    for (ApplicationListener<?> listener : getApplicationListeners(event)) {
        listener.onApplicationEvent(event);
    }
}

此方法会遍历所有注册的监听器,并调用它们的 onApplicationEvent 方法处理事件。

5.3 监听器的排序

Spring 中允许对监听器进行排序,以控制事件处理的顺序。具体实现是通过 @Order 注解或 Ordered 接口来完成的。

6.使用场景

  1. 用户登录事件:当用户登录时,可以发布一个登录事件,监听器对此进行处理,比如记录日志等。
  2. 订单创建事件:在电商系统中,可以在订单创建时发布事件,处理库存扣减、消息通知等逻辑。
  3. 数据变更事件:在数据更新时,可以广播一个事件,通知其他服务更新缓存或重新加载数据。

7. 总结

本文我们详细地介绍了SpringBoot事件机制的原理、核心源码以及实际使用方法。通过运用事件机制,我们可以更好地实现解耦合和异步处理,为项目的可维护性和扩展性提供支持。

【SpringBoot3】Spring Boot Event 自定义事件的发布与监听 Spring Boot自定义事件是Spring框架中事件处理机制的一种扩展,它允许开发者在Spring Boot应用程序中定义、发布和监听自己的事件。这些事件可以用于在应用程序的不同组件之间进行通信,实现解耦和异步处理。通过自定义事件,开发者可以更加灵活地处理业务逻辑,提高系统的可扩展性和可维护性。 阅读详情

相关推荐

SpringBoot ApplicationEvent:事件发布与监听机制

*** 用户注册事件* 在用户注册成功后发布,用于执行后续操作*/// 用户ID// 用户名/*** 构造函数* @param source 事件源(发布事件的对象)* @param userId 注册用户ID* @param username 注册用户名*/这个例子定义了一个用户注册事件,它在用户注册成功后被发布,携带了用户ID和用户名信息,可以被其他组件监听并作出响应。

程序媛学姐的博客 1966

Spring Boot:Spring Event的初步讲解

Spring提供了Event的功能,只要添加了spring-context依赖就可以引入,简单好用。 要使用Event只要准备三个部分: 事件类:定义事件,继承ApplicationEvent的类成为一个事件类。 发布者:发布事件,通过ApplicationEventPublisher发布事件。 监听者:监听并处理事件,实现ApplicationListener接口或者使用@EventListener注解 举个例子 定义发布者 事件源通常是某个业务类,当它处理完自身的业务

言尭的博客 5930

前端通信库fetch-event-source实现丰富的SSE

相比轮询,SSE显著降低延迟与资源消耗,是Web实时应用的优选方案之一。最终效果与使用原生EventSource一样,但是使用Fetch-Event-Source我们的可配置项非常多(只要Fetch API支持的都可以使用)。本篇文章我们将介绍一个开源组件fetch-event-source,该组件在发起事件源请求时,同时拥有Fetch API所提供的所有功能。/sse,该接口将通过fetch-event-source库来处理,注意这时候我们使用的是POST请求,并且还携带了请求body内容。

FeelTouch Labs 3771

秒懂SpringBoot之Spring Events全解析

相信即使是刚入门Java的小朋友们对事件(Event)也不会陌生,只要接触过消息队列,例如RabbitMq、Kafka等的都清楚。其思想和观察者这个设计模式类似,不懂的点击链接先学习一下前置知识。今天要谈论的Event是Spring给我们提供的一套类似的机制,某些场景下其有奇效,使你的技术水平立马绝尘于你的小伙伴们,装x成功是毫无疑问了…关于Spring Framwork 提供的事件机制就聊到这里了,其在日常开发过程中出境率还是挺高的,希望对后辈有所帮助。

ShuSheng007的程序人生 3395

【Spring】Spring Boot 之事件(Event)ApplicationEvent

ApplicationContext 通过 ApplicationEvent 类和 ApplicationListener 接口进行事件处理。如果将实现 ApplicationListener 接口的 bean 注入到上下文中,则每次使用 ApplicationContext 发布 ApplicationEvent 时,都会通知该 bean。本质上,这是标准的观察者设计模式。

九师兄 2065

ESP32 TWAI CAN库实战:从零构建CyberGear微电机控制框架

本文详细介绍了如何利用ESP32的TWAI控制器和Arduino环境,从零构建一个面向对象的CyberGear微电机控制框架。该框架将复杂的CAN通信协议封装为简洁的API,开发者无需深究底层细节,即可轻松实现电机的速度、位置和扭矩控制,大幅简化机器人关节、云台等项目的开发流程。

oil88的博客 499

Springboot中的事件Event

事件Event作为一种常用的线程通讯工具,在Springboot中可以方便地提供开发者进行线程交互。 1.事件定义 1 import org.springframework.context.ApplicationEvent; 2 3 /** 4 * WebSocket触发事件定义 5 * @author : Asp1rant 6 * @date : 19-...

weixin_34408624的博客 313

zemax显微镜设计

光学显微镜(Optical Microscope,简写OM)是利用光学原理,把人眼所不能分辨的微小物体放大成像,以供人们提取微细结构信息的。我这里是插入进来之后才反转,如果之前已经在目镜的单独文件夹反转过了就不用了。将目镜的焦距设定为25mm,通过缩放,然后将镜头调转过来。镜头数据中的曲率半径、物距像距都设置为变量。将镜头的焦距整体变为16.25mm。将孔径类型设置为按照光阑尺寸浮动。打开物镜的文件,选择插入镜头。由英国物理学家虎克制作。2、像空间孔径0.25。3、像面大小-0.9。

fendoudecheng的博客 8546

SpringBoot 3 Event 个人详细总结

JDK17类描述封装装事件发布功能的接口可以管理多个ApplicationListener对象并向其发布事件的对象实现的接口,一个典型的例子就是,实现了接口,并在其内部实现中,使用了作为实际发布事件的发布者。实现了接口,它是Spring Event 体系的实际发布者: Application Event listeners监听器接口,在Spring 6.1之后添加了方法,来控制该监听器是否支持异步执行,默认是true,支持异步执行。是的子类,它对非的类进行了封装,使得可以在各个监听器中进行事件传播。

2401_87705025的博客 2012

【第一篇】Xshell连接服务器部署前后端项目(连接服务器)

利用Xshell连接服务器部署前后端项目

blog 1073

电压电流双闭环PFC单相PWM整流

电压电流双闭环PFC单相整流。仿真及代码

xht2403267701的博客 6052

springboot publish event 事件机制demo

springboot publish event 事件机制demo 复制下面全部代码,右键包名,粘贴即可生成java类,执行即可看到效果。 事件机制: 需要自定义一个事件类继承ApplicationEvent; 需要自定义一个监听器类实现ApplicationListener接口,或普通类的方法中使用@EventListener注解; 使用默认发布器ApplicationEventPublisher发布即可; 事件类不需要注入到IOC;监听器需要注入到IOC;ApplicationEventPublish

没啥简介 9202

高通camera open代码流程(hal到kernel)

内容:简单介绍Camera open代码调用流程,从HAl到kernel。(api1+hal1) 前言 Android camera api和hal对应关系。安卓在版本更新过程中,camera相关代码也经历了几个版本的更新,表现为camera HAL版本更新(HAL1->HAL2->HAL3),camera API版本更新(camera API1->camera API2),接下...

oxoo123的专栏 4276

springBoot的event事件发布/监听

springBoot的event事件发布/监听

奔跑的菜鸡 3037

c#窗体应用(.NET Framework)项目对Yaml文件进行写入与读取,Yaml数据转换成json

用到的技术与版本准备工作Yaml数据在C#中进行定义对Yaml文件的读取与写入代码的添加窗体控件控制操作写入数据到Yaml文件读取Yaml文件数据Yaml数据转换成json改进——对yaml文件读取时根据yaml文件中的键进行获取,对c#中怎么取名字无关yaml文件中多个数据读取遇到的问题总结的小点参考的文章在对Yaml文件进行读取前,先将Yaml文件中的数据结构在c#中进行定义,以便后面更好的读取。这里对这四个类型进行举例(这里为了想看看这四个类型到Yaml文件的格式是什么样子的)

永远年轻 1587

VCAST创建单元测试工程

选择工作目录,后面创建胡UT工程将会生成到这个目录。

qq_42851449的博客 2483

Springboot整合spring Application event

1.事件的概念 Spring的事件(Application Event)为Bean与Bean之间的消息通信提供了支持。当一个Bean处理完一个任务之后,希望另外一个Bean知道并能做相应的处理,这时我们就需要让另外一个Bean监听当前Bean所发送的事件。 Spring的事件需要遵循如下流程: (1)自定义事件,集成ApplicationEvent。 (2)定义事件监听器,实现ApplicationListener。 (3)使用容器发布事件。 2.代码示例 (1)定义事件类 package c.

zhangxl123liang的博客 391

《网络存储技术》形考实训4:为小微企业搭建基于Windows Server的文件共享与权限管理服务

本文介绍了在域环境下部署DFS分布式文件系统的完整流程。项目目标是将3台存储服务器(NS1、NS2、NS3)上的多个共享文件夹通过DFS命名空间进行统一整合,使员工可通过单一访问路径访问所有资源。实施步骤包括:1)搭建AD域环境并创建用户/组;2)将存储服务器加入域并配置共享权限;3)在域控制器安装DFS命名空间角色;4)创建基于域的命名空间(\xc.cn\共享);5)将各服务器共享文件夹映射到命名空间;6)进行客户端访问验证。通过DFS实现了物理存储位置不变情况下的逻辑统一访问,提高了文件管理的便捷性和可

深耕计算机专业知识与技术。 946

Springboot事件监听机制:工作原理

这是继《springboot事件监听机制一:实战应用》第二篇,知其然,当然还要知其所以然,深入的源码里面探寻一下这一有套机制的工作原理。spring生态很茂盛,这里不会站太高去分析这个问题,大扯spring的一些原理,而是以一个求知者的心态去探索spring监听机制的秘密,可能我分析得并不透彻,但我想如果能给看到这篇文章的你带去一些灵感或者触动也是好的。罗马不是一天就能建立起来的,想要弄懂它也非一天的事,多想多看总会明白的。另外看源码的时候,一定是带着问题去探寻,时刻把握好问题的核心,切忌被旁枝末节打扰而迷

凡夫编程 2575

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

# SpringBoot Event 事件同步、异步处理

SpringBoot Event事件同步、异步处理 业务需求场景:按照一定的顺序做一些事情,例如向A表插入数据事物提交之后,向B表中插入历史记录,最后向C表插入。 事件机制 事件监听机制可以理解为是一种观察者模式,有数据发布者(事件源)和数据接受者(监听器);在Java中,事件对象都是继承java.util.EventObject对象,事件监听器都是java.util.EventListener实例;Spring中 Java事件 EventObject java.util.EventObject是事

不积跬步,无以至千里;不积小流,无以成江海 4479

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Spring Event 别瞎用!被它坑的绩效都没了!

这是我司线上生产环境实际踩坑后,总结的极为宝贵的经验!Spring Event框架实现了基于事件的发布订阅机制。开发者可以自定义事件,在某些业务场景发布事件,Spring 会将该事件广播给监听该事件的监听者。监听者可以实现Spring 的监听者接口注册自己,也可以使用注解注册自己。这是Spring Event 的简短介绍,网上有大量的入门级教程,我在此不过多赘述,进入正文!

m0_50180963的博客 1027

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Springboot event 异步事件

https://www.jianshu.com/p/5f57f2aa5e2c

zhaoyang10的专栏 1517

SpringBoot的事件Event

事件机制是一种实现模块之间解耦合的方案。在软件开发过程中,不同的模块之间需要完成数据交互和流程调度。同时,业务场景与数据的变化也会影响到应用程序的行为。此时,实现模块之间的解耦合便非常有必要。事件机制就是一种能够响应业务场景和数据变化的方案,当某些操作发生时,事件机制通知应用程序中的其他部分。事件机制的设计可以分离关注点,并且可以更容易地扩展新的功能。关注微信公众号:“小虎哥的技术博客”。

小虎哥的技术博客 255

springBoot Event实现异步消费机制

ApplicationEvent以及Listener是Spring为我们提供的一个事件监听、订阅的实现,内部实现原理是观察者设计模式,设计初衷也是为了系统业务逻辑之间的解耦,提高可扩展性以及可维护性。

weixin_46237429的博客 989
上一篇: 猎杀时刻,阿里高工总结spring全栈笔记,疯狂狩猎大厂offer!
下一篇: 太卷了!Spring Boot 3.x 原来有这么多优点
退休的汤姆
博客等级 码龄7年 1657粉丝 1051原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值