当前位置: 首页 > news >正文

06-Spring 中的事件驱动机制

Spring 中的事件驱动机制(ApplicationEvent 源码解析)

本小结主要总结Spring的事件,如果对于观察者模式比较熟悉的话,理解这个应该不难。 这块涉及的面试题相对简单,主要还是以日常使用为主。
另外在Spring的源码中也运用到了大量的事件,如果有大佬想要详细了解的话,小弟也可单独整一篇Spring中的设计模式来一块交流。(当然这个也是Spring面试的重灾区,回答准确明细与否,可能直接关系到技术面试的结果!!)

一、Spring 事件驱动机制概述

Spring 提供了 基于观察者模式的事件驱动机制,用于在应用程序内不同组件之间进行解耦通信。

Spring 的事件驱动机制主要由以下三个核心组件组成:

  • ApplicationEvent(事件): 事件的抽象基类,所有自定义事件需要继承该类。
  • ApplicationListener(监听器): 监听并处理特定类型的事件。
  • ApplicationEventPublisher(事件发布器): 负责事件的发布,通常由 ApplicationContext 充当该角色。

二、Spring 事件驱动机制的基本使用

2.1 自定义事件

public class MyCustomEvent extends ApplicationEvent {
    private String message;

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

    public String getMessage() {
        return message;
    }
}

2.2 事件监听器

@Component
public class MyEventListener implements ApplicationListener<MyCustomEvent> {
    @Override
    public void onApplicationEvent(MyCustomEvent event) {
        System.out.println("收到事件:" + event.getMessage());
    }
}

2.3 发布事件

@Service
public class EventPublisherService {
    @Autowired
    private ApplicationEventPublisher eventPublisher;

    public void publishEvent(String message) {
        MyCustomEvent event = new MyCustomEvent(this, message);
        eventPublisher.publishEvent(event);
    }
}

三、Spring 事件驱动机制源码解析

3.1 事件发布的核心流程

Spring 事件发布的核心流程如下:

  1. 事件由 ApplicationEventPublisher#publishEvent 方法发布。
  2. Spring 内部使用 ApplicationEventMulticaster 进行事件广播。
  3. 事件广播后,符合条件的 ApplicationListener 监听器会被触发,执行 onApplicationEvent 方法。
源码解析:ApplicationEventPublisher#publishEvent
@Override
public void publishEvent(ApplicationEvent event) {
    this.multicastEvent(event, this.resolveDefaultEventType(event));
}

3.2 事件广播器 ApplicationEventMulticaster

Spring 通过 ApplicationEventMulticaster 来管理事件的广播。

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

四、高频面试题

Q1:Spring 事件驱动机制的主要作用是什么?

A1:Spring 事件机制主要用于实现 组件间的松耦合通信,如系统启动事件、用户操作日志记录等。


Q2:如何异步处理事件?

A2:可以使用 @Async 让事件监听器异步执行:

@Component
public class AsyncEventListener {
    @Async
    @EventListener
    public void handleEvent(MyCustomEvent event) {
        System.out.println("异步处理事件:" + event.getMessage());
    }
}

五、总结

  • Spring 事件驱动机制基于观察者模式,实现了组件之间的解耦。
  • 事件发布者 通过 ApplicationEventPublisher 触发事件。
  • 事件监听器 通过 ApplicationListener@EventListener 监听事件。
  • 事件广播器 通过 ApplicationEventMulticaster 负责调用监听器。
http://www.dtcms.com/a/109951.html

相关文章:

  • JAVA学习小记之IO流04--转换流篇
  • EasyExcel 数据字典转换器实战:注解驱动设计
  • Django4.0的快速查询以及分页
  • Flink SQL-Client Kafka connector
  • Uni-app 项目 PDF 批注插件库在线版 API 示例教程
  • Ceph异地数据同步之-RBD异地同步复制(上)
  • 每日一题(小白)ASCLL娱乐篇5
  • ARM架构+CODESYS:解锁嵌入式边缘计算的实时控制新范式
  • MIT6.828 Lab3-2 Print a page table (easy)
  • 大数据学习(98)-数据治理
  • 预测分析(二):基于机器学习的数值预测
  • 【大模型基础_毛玉仁】6.3 知识检索
  • API接口调用
  • 通信算法之256: 无人机Remote ID(远程识别)
  • adc推荐,单通道,双极性采集
  • 最近常用 python 记录
  • 环境数据综合分析系统
  • 贤小二c#版Yolov5 yolov8 yolov10 yolov11自动标注工具 + 免python环境 GPU一键训练包
  • 贴片加工SMT厂核心工艺解析
  • 码界奇缘 Java 觉醒 第二章 变量迷城
  • 计算机网络-TCP的重传机制
  • 清晰易懂的 Flutter 开发环境搭建教程
  • java短连接,长连接
  • Linux命令-uniq
  • RAGFlow部署与使用介绍-深度文档理解和检索增强生成
  • 本地部署 Firecrawl 爬虫让 AI 知识库更丰满
  • Java创建对象和spring创建对象的过程和区别
  • AI赋能数据库管理“最后一公里”,融合架构重塑数据库承载成本效能——zCloud 6.7与zData X 3.3正式发布
  • MonkeyDev 如何创建一个root级级别的app,并执行root命令获取iphone设备序列号serialNumber(ios15.8)
  • 航电系统之承重与避障技术