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

Spring框架事件驱动架构核心注解之@EventListener

Spring框架事件驱动架构核心注解之@EventListener

  • Spring框架事件驱动架构核心注解之@EventListener
    • 1、概述
    • 2、Spring事件机制核心组件
      • (1)事件(Event)
      • (2)发布者(Publisher)
      • (3)监听器 (Listener)
    • 3、高阶特性
      • (1)异步事件
      • (2)多事件监听
      • (3)条件监听
      • (4)监听器排序
    • 4、总结

Spring框架事件驱动架构核心注解之@EventListener


1、概述

@EventListener 是 Spring 框架中用于实现事件驱动编程模型的核心注解。它允许应用程序的不同部分以一种松散耦合的方式进行通信。一个组件(发布者)发布一个事件,而其他组件(监听者)可以监听并响应该事件,而发布者无需知道谁是监听者。

@EventListener 注解用于将一个普通方法标记为事件监听器,监听指定类型的事件。
示例:

@Component
public class MyEventListener {@EventListenerpublic void handleEvent(MyCustomEvent event) {System.out.println("Received event: " + event.getMessage());}
}

2、Spring事件机制核心组件

(1)事件(Event)

任何继承自 ApplicationEvent 的类都是一个event,在Spring 4.2+ 版本后,一个普通的 POJO 类也可以是一个event,不需要再继承 ApplicationEvent。事件封装了事件源和要传递的信息。
例如:ContextRefreshedEvent(容器刷新事件)、ContextStartedEvent(容器启动事件)等是 Spring 内置的事件。
而自定义事件通常是一个简单的数据对象,用于携带信息。

// 自定义用户注册成功事件,只是一个简单的数据对象
@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserRegisteredEvent {private String username;
}

(2)发布者(Publisher)

负责发布事件的组件。它通过 ApplicationEventPublisher 接口的 publishEvent() 方法来发布事件。

@Service
public class UserService {// 注入事件发布器@Autowiredprivate ApplicationEventPublisher applicationEventPublisher;public void registerUser(String username, String password) {// 1. 模拟用户注册逻辑(如保存到数据库)System.out.println("用户 " + username + " 注册成功,已保存至数据库。");// 2. 发布一个『用户注册成功』事件//    事件对象中包含了刚刚注册的用户名信息applicationEventPublisher.publishEvent(new UserRegisteredEvent(username));}
}

(3)监听器 (Listener)

负责接收并处理事件的组件。它可以通过两种方式定义:

  • 实现 ApplicationListener 接口(不推荐):实现 onApplicationEvent(E event) 方法。这种方式会监听所有类型为 E 及其子类的事件;
  • 使用 @EventListener 注解:更现代、更灵活的方式。将一个普通方法标记为事件监听器,该方法通过其参数来声明它要监听的事件类型。
@Component
public class EmailService {// 通过方法参数声明要监听的事件类型@EventListenerpublic void sendWelcomeEmail(UserRegisteredEvent event) {String username = event.getUsername();System.out.println("【邮件服务】正在向 " + username + " 发送欢迎邮件...");}
}

3、高阶特性

(1)异步事件

默认情况下,事件是同步发布的。这意味着发布者会阻塞,直到所有监听器都处理完事件。可以搭配 @Async@EnableAsync 注解实现异步事件监听。
具体方法:

  1. 在主配置类上开启异步支持
  2. 在监听器方法上添加 @Async 注解

(2)多事件监听

在一个处理方法中对多个事件处理。
示例:

@Component
public class GenericEventListener {// 监听多种事件@EventListener({UserRegisteredEvent.class, UserLoginEvent.class})public void handleUserEvent(Object event) {if (event instanceof UserRegisteredEvent) {// ... 处理注册事件} else if (event instanceof UserLoginEvent) {// ... 处理登录事件}}

(3)条件监听

可以使用 SpEL 表达式来设置触发条件。
示例:

@Component
public class GenericEventListener {// 条件化监听:只有当事件中的username是"admin"时才处理@EventListener(condition = "#event.username == 'admin'")public void handleAdminEvent(UserRegisteredEvent event) {System.out.println("检测到管理员用户注册,进行特殊处理...");}
}

(4)监听器排序

使用 @Order 注解可以指定监听器执行的顺序。数字越小,优先级越高。
示例:

@Component
public class LogService {@Order(1) // 优先级最高,最先执行@EventListenerpublic void logEvent(UserRegisteredEvent event) {System.out.println("【日志服务】记录用户注册事件...");}
}

4、总结

@EventListener 是 Spring 事件机制的重要组成部分,极大地提升了事件监听的简洁性与灵活性。通过注解方式,开发者可以专注于业务处理逻辑,而无需关心底层监听器的实现细节。同时配合异步执行、条件判断、事务控制等特性,使其在实际项目中拥有极高的实用价值。


文章转载自:

http://h1P3fCqG.pqnpd.cn
http://Al7ApFR3.pqnpd.cn
http://3rJKzX7S.pqnpd.cn
http://O9TKIU7b.pqnpd.cn
http://Q6994hsm.pqnpd.cn
http://0KVdPuqj.pqnpd.cn
http://r4DoBkzr.pqnpd.cn
http://DZQ6uKQf.pqnpd.cn
http://dNou3osQ.pqnpd.cn
http://48ZzkNFg.pqnpd.cn
http://Sr9C8CsZ.pqnpd.cn
http://GHT8yiMQ.pqnpd.cn
http://4IQhNQJ1.pqnpd.cn
http://STfMSvOt.pqnpd.cn
http://E1L0br0z.pqnpd.cn
http://jKC7ksbI.pqnpd.cn
http://1igvyrek.pqnpd.cn
http://FxRvTL9V.pqnpd.cn
http://hz60F2S2.pqnpd.cn
http://LJYhAJip.pqnpd.cn
http://LhTMdexN.pqnpd.cn
http://6dte86pY.pqnpd.cn
http://gXt7S29r.pqnpd.cn
http://Uh0Q0bHO.pqnpd.cn
http://R9VUU2fD.pqnpd.cn
http://Sui9q1QF.pqnpd.cn
http://eETEVnLc.pqnpd.cn
http://kW4cVqSa.pqnpd.cn
http://hqTzuQOo.pqnpd.cn
http://LSwk1BGx.pqnpd.cn
http://www.dtcms.com/a/374670.html

相关文章:

  • ARM的big.LITTLE架构
  • 整体设计 之 绪 思维导图引擎 :思维价值链分层评估的 思维引导和提示词导航 之 引 认知系统 之8 之 序 认知元架构 之3(豆包助手 之5)
  • 飞算JavaAI全链路实战:智能构建高可用电商系统核心架构
  • 01-AI-神经网络-视觉-PaddleDetection交通信号灯的目标检测的模型训练(平台提供的数据集)
  • SpringBoot改造MCP服务器(StreamableHTTP)
  • Gradle 与 Android 构建缓存机制全面总结
  • 数据结构题集-第四章-串-采用特定数据类型对串求逆
  • 新能源汽车中维修开关有什么作用?
  • GitHub 热榜项目 - 日榜(2025-09-09)
  • Go 装饰器模式学习文档
  • 20.44 QLoRA调参秘籍:零成本实现7B模型微调,参数黄金配比全解析(附3090实战方案)
  • Ubuntu 22.04 安装 Docker Compose 最新最简单完整指南​
  • 网络原理——传输层协议UDP
  • 从Java全栈开发到云原生实践:一次真实面试的深度剖析
  • 更换libc.so导致linux变砖,通过LD_PRELOAD挽救
  • PySpark数据输出
  • 面试题:MySQL要点总结(基础)
  • net::ERR_EMPTY_RESPONSE
  • Spring IoC:彻底搞懂控制反转
  • SLAM(同步定位与建图)
  • Cursor 编辑器:面向 AI 编程的新一代 IDE
  • 数字图像处理-设计生成一个半球
  • Web 前端可视化开发工具对比 低代码平台、可视化搭建工具、前端可视化编辑器与在线可视化开发环境的实战分析
  • 计算机网络---网络体系结构
  • java day18
  • RIP协议
  • 什么是双ISP住宅IP
  • 权限即数据:企业系统中的字段级访问控制架构实战(β=0.7)
  • K8S集群管理(3)
  • NW578NW582美光固态闪存NW583NW594