Spring事件监听:无法接收List<event>?

在日常开发中,我们常使用 Spring 的 @EventListener 注解来监听事件。但在处理 批量事件 时,却可能遇到一些"看似合理但无法生效"的监听方式。

本文以实际具体案例为出发点,结合源码分析事件派发逻辑,并给出两种可行解决方案,帮助你真正吃透 Spring 事件机制。

问题背景:监听 List<User> 无法生效

UserService#save 方法中发送一个批量用户事件:

希望在监听器中直接接收这批用户:

但实际上,这个方法不会被触发。

源码剖析:Spring 是如何匹配监听器的?

通过上图可知,获取事件监听器是核心,其源码如下:

在 Spring 中,@EventListener 注解的方法在容器启动阶段,会被 EventListenerMethodProcessor 扫描并封装为 ApplicationListenerMethodAdapter 类型的监听器。匹配逻辑的关键如下所示:

解决方案

方法一:监听 PayloadApplicationEvent<List<User>>

这种写法可以被正确识别为监听器,因为事件类型完全匹配。

方法二:自定义包装类型

如果希望在业务中更明确事件语义,也可以自定义一个批量事件对象:

然后相应地修改发布事件:

这种方式具有更好的可读性和扩展性,推荐使用


如果你觉得这篇文章对你有启发,欢迎点赞、收藏、转发 🙌

如文中有理解不当或疏漏之处,也欢迎留言指正,共同进步 🙏,持续分享更多 Spring 源码剖析、实战技巧与架构实践,欢迎关注!

相关推荐
艾菜籽2 小时前
Spring MVC练习:留言板
java·spring·mvc
摇滚侠2 小时前
Spring Boot 3零基础教程,WEB 开发 自定义静态资源目录 笔记31
spring boot·笔记·后端·spring
摇滚侠2 小时前
Spring Boot 3零基础教程,WEB 开发 Thymeleaf 遍历 笔记40
spring boot·笔记·thymeleaf
左灯右行的爱情2 小时前
4-Spring SPI机制解读
java·后端·spring
橘子海全栈攻城狮3 小时前
【源码+文档+调试讲解】基于SpringBoot + Vue的知识产权管理系统 041
java·vue.js·人工智能·spring boot·后端·安全·spring
Json_4 小时前
学习springBoot框架-开发一个酒店管理系统,熟悉springboot框架语法~
java·spring boot·后端
kkkkk0211064 小时前
微服务学习笔记(黑马商城)
java·spring boot·spring·spring cloud·sentinel·mybatis·java-rabbitmq
阿里云云原生4 小时前
零代码改造 + 全链路追踪!Spring AI 最新可观测性详细解读
spring·云原生
冲鸭ONE5 小时前
新手搭建Spring Boot项目
spring boot·后端·程序员
数智顾问5 小时前
Flink ProcessFunction 与低层级 Join 实战手册:多流广告计费精确去重
java·spring boot·spring