当前位置: 首页 > 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.dtcms.com/a/359419.html

相关文章:

  • BigDecimal账户分布式原子操作
  • Linux 中进入 root 权限
  • dayjs 常用方法总结
  • Nginx 502 Bad Gateway:从 upstream 日志到 FastCGI 超时复盘
  • 【大数据技术实战】流式计算 Flink~生产错误实战解析
  • vim-plugin AI插件
  • Playwright Python教程:基础篇
  • 秋招笔记-8.31
  • 在集群级别应用 Pod 安全标准
  • 【MySQL】练习12-4:启用GTID并配置循环复制
  • Conda相关的用法
  • 人工智能之数学基础:连续型随机变量
  • Langflow 评估与迭代技术深度分析
  • 3DES加解密的算法Java Python Golang
  • 【大模型面试宝典之微调篇】(一)
  • 算法之链表
  • Windows中如何将Docker安装在E盘并将Docker的镜像和容器存储在E盘的安装目录下
  • 四数之和的一些判断怎么记忆
  • 《哲思:生命与宇宙的终极意义》
  • 分治思想与分治算法的区别
  • C6.7:输入电阻的负载效应及其CE负反馈放大器
  • 【线性代数基础 | 那忘算9】基尔霍夫(拉普拉斯)矩阵 矩阵—树定理证明 [详细推导]
  • ICode总线原理
  • Playwright Python 教程:高级篇
  • JDK 22 Windows 64位安装教程(含环境变量配置+验证步骤+附安装包下载)
  • Qwen3_moe模型代码解析
  • 数据结构与算法:线段树(三):维护更多信息
  • 运筹说 第141期 | 启发式算法:用简单规则、破解复杂问题
  • WEB漏洞挖掘篇(一) 基本概念、十大常見WEB漏洞
  • 自底向上了解CPU的运算