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

【Spring】ApplicationListener监听器

【Spring】ApplicationListener监听器

  • 【一】核心作用与功能
    • 【1】核心功能:
    • 【2】核心特性:
  • 【二】使用案例
    • 【1】案例 1:监听 Spring 内置事件(容器刷新事件)
    • 【2】案例 2:自定义业务事件(订单创建事件)
    • 【3】案例 3:使用注解方式实现监听器(推荐)
  • 【三】Spring 内置事件类型
  • 【四】功能拓展
    • 【1】异步事件处理
    • 【2】监听器执行顺序控制
    • 【3】事务绑定事件监听
  • 【五】注意事项

【一】核心作用与功能

ApplicationListener是 Spring 框架中事件驱动模型的核心接口,实现了观察者模式,用于监听和处理 Spring 容器中发布的各种事件。

【1】核心功能:

1.事件监听​:监听 Spring 容器中发布的 ApplicationEvent及其子类事件
2.​事件处理​:定义事件触发时的响应逻辑
3.​解耦通信​:实现组件间的松耦合通信
4.​生命周期监控​:监听 Spring 容器的生命周期事件
5.​自定义事件​:支持开发者扩展自定义业务事件

【2】核心特性:

•​类型安全​:通过泛型指定监听的事件类型
•​异步支持​:可配合 @Async实现异步事件处理
•​顺序控制​:通过 @Order注解控制监听器执行顺序
•​条件过滤​:使用 @Conditional实现条件化监听

在这里插入图片描述

【二】使用案例

【1】案例 1:监听 Spring 内置事件(容器刷新事件)

import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;@Component
public class ContextRefreshListener implements ApplicationListener<ContextRefreshedEvent> {@Overridepublic void onApplicationEvent(ContextRefreshedEvent event) {System.out.println("容器刷新完成,开始初始化操作");System.out.println("加载的Bean数量: " + event.getApplicationContext().getBeanDefinitionCount());// 执行初始化逻辑initCache();preloadData();}private void initCache() {// 初始化缓存逻辑}private void preloadData() {// 预加载数据逻辑}
}

【2】案例 2:自定义业务事件(订单创建事件)

(1)定义自定义事件​

public class OrderCreatedEvent extends ApplicationEvent {private final Order order;public OrderCreatedEvent(Object source, Order order) {super(source);this.order = order;}public Order getOrder() {return order;}
}

(2)创建事件监听器​

@Component
public class OrderCreatedListener implements ApplicationListener<OrderCreatedEvent> {@Overridepublic void onApplicationEvent(OrderCreatedEvent event) {Order order = event.getOrder();// 发送通知sendEmailNotification(order);// 更新库存updateInventory(order);// 记录审计日志logAudit(order);}private void sendEmailNotification(Order order) {System.out.println("发送订单确认邮件至: " + order.getCustomerEmail());}private void updateInventory(Order order) {System.out.println("更新库存,订单ID: " + order.getId());}private void logAudit(Order order) {System.out.println("记录审计日志,订单金额: " + order.getAmount());}
}

(3)发布事件​

@Service
public class OrderService {private final ApplicationEventPublisher eventPublisher;public OrderService(ApplicationEventPublisher eventPublisher) {this.eventPublisher = eventPublisher;}public Order createOrder(OrderRequest request) {// 创建订单逻辑Order order = new Order(request);// 发布订单创建事件eventPublisher.publishEvent(new OrderCreatedEvent(this, order));return order;}
}

【3】案例 3:使用注解方式实现监听器(推荐)

@Component
public class AnnotationBasedListeners {// 监听容器关闭事件@EventListenerpublic void handleContextClosed(ContextClosedEvent event) {System.out.println("容器关闭,执行清理操作");releaseResources();}// 监听自定义订单事件@EventListener@Async  // 异步处理@Order(1) // 执行顺序public void handleOrderCreated(OrderCreatedEvent event) {System.out.println("异步处理订单创建事件");processOrderAsync(event.getOrder());}// 条件化监听(仅当订单金额大于1000时触发)@EventListener(condition = "#event.order.amount > 1000")public void handleLargeOrder(OrderCreatedEvent event) {System.out.println("处理大额订单: " + event.getOrder().getId());notifyManager(event.getOrder());}
}

【三】Spring 内置事件类型

在这里插入图片描述

【四】功能拓展

【1】异步事件处理

@Configuration
@EnableAsync
public class AsyncConfig implements AsyncConfigurer {@Overridepublic Executor getAsyncExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(5);executor.setMaxPoolSize(10);executor.setQueueCapacity(25);executor.initialize();return executor;}
}@Component
public class AsyncEventListener {@EventListener@Asyncpublic void handleAsyncEvent(OrderCreatedEvent event) {// 耗时操作generateReport(event.getOrder());}
}

【2】监听器执行顺序控制

@Component
public class OrderedListeners {@EventListener@Order(1)public void firstListener(OrderCreatedEvent event) {System.out.println("第一个执行:验证订单");}@EventListener@Order(2)public void secondListener(OrderCreatedEvent event) {System.out.println("第二个执行:处理支付");}@EventListener@Order(Ordered.LOWEST_PRECEDENCE)public void lastListener(OrderCreatedEvent event) {System.out.println("最后执行:发送通知");}
}

【3】事务绑定事件监听

@Component
public class TransactionalEventListener {// 在事务提交后执行@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)public void afterCommit(OrderCreatedEvent event) {System.out.println("事务提交后执行");}// 在事务回滚后执行@TransactionalEventListener(phase = TransactionPhase.AFTER_ROLLBACK)public void afterRollback(OrderCreatedEvent event) {System.out.println("事务回滚后执行");}
}

【五】注意事项

1.​事件命名规范​:使用过去时态命名事件(如OrderCreated)
2.​保持监听器无状态​:避免在监听器中维护状态
3.​控制监听器耗时​:长时间操作应使用异步监听
4.​异常处理​:在监听器内部处理异常,避免影响事件发布者
5.​避免循环事件​:防止事件发布导致无限循环
6.​性能监控​:对关键事件监听器进行性能监控

常见问题解决方案

(1)​问题1:监听器未触发​
检查监听器是否被 Spring 管理(添加@Component)
确认事件是否正确发布(使用ApplicationEventPublisher)
检查事件类型是否匹配
(2)​问题2:监听器执行顺序不符合预期​
使用@Order注解明确指定顺序
确保监听器在同一个线程执行(异步监听器顺序不可控)
(3)​问题3:事务事件监听器不触发​
确认方法使用@TransactionalEventListener
检查事务是否成功提交/回滚
确保事件在事务上下文中发布
(4)​问题4:异步监听器阻塞​
配置合适的线程池大小
监控线程池队列长度
避免在监听器中执行长时间阻塞操作

http://www.xdnf.cn/news/1414081.html

相关文章:

  • 【芯片测试篇】:LIN总线
  • AI 赋能 Java 开发效率:全流程痛点解决与实践案例(一)
  • Linux/UNIX系统编程手册笔记:用户和组、进程凭证、时间以及系统限制和选项
  • 利用DeepSeek编写验证xlsx格式文件中是否启用sharedStrings.xml对读写效率影响python程序
  • DRF快速构建RESTful API指南
  • redis详解 (最开始写博客是写redis 纪念日在写一篇redis)
  • C++内存序不迷茫:从CPU缓存一致性理解Memory Order
  • Wi-Fi技术——初识
  • 如何绕过 disable-devtool.js 打开控制台
  • C语言中如何使用NULL
  • 配置 Kubernetes Master 节点不可调度的标准方法
  • stm32F4挂载emmc以及重定义printf
  • ThinkPHP8学习篇(五):数据库(一)
  • 洛谷p2392kkksc03考前临时抱佛脚 详解(回溯,深度搜索法)
  • Redis常见数据类型及应用场景
  • java 安装流程配置
  • 金仓数据库KingbaseES:中国自主原创的数据库领军者
  • 【四位加密】2022-10-25
  • GDPU操作系统实验:生产者消费者问题
  • 【读数笔记】《你的生存本能正在杀死你》
  • 经典卷积神经网络CNN
  • sublime MAC系统快捷键及常见问题
  • Qwen2.5-VL代码初步解读
  • 恒香全新旗舰店开幕 新店传承百年文化
  • 容器seccomp配置文件在云服务器安全策略中的实施规范
  • 常用定位技术对比解析
  • MySQL数据库——0.MySQL大纲
  • 【全功能图片处理工具详解】基于Streamlit的现代化图像处理解决方案
  • OpenCV 图像轮廓检测
  • 【系统分析师】高分论文:论面向服务方法在信息系统开发中的应用