尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

Spring ApplicationEventPublisher 事件发布

Spring ApplicationEventPublisher 事件发布
📅 发布时间:2026/6/19 23:02:07

ApplicationEventPublisher

ApplicationEventPublisher是一个事件发布器,我们可以通过ApplicationContext来发布一个相应的事件
主要涉及到 事件定义、事件发布、事件订阅 三个模块

demo

事件

需要继承org.springframework.context.ApplicationEvent

/*** 定义我的事件*/
public class MyEvent extends ApplicationEvent {private String msg;public MyEvent(String msg) {super(msg);this.msg = msg;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}
}

发布

使用applicationEventPublisher发布事件即可

/*** 发布方** @author * @since 2024/12/4 20:30*/
@Component
public class MyPublisher implements ApplicationEventPublisherAware {private ApplicationEventPublisher applicationEventPublisher;private int id = 0;/*** 起了个定时任务,用来测试事件发布*/@Scheduled(cron = "*/30 * * * * ?")public void loop() {publish();}public void publish() {System.out.println("publish event. id: " + id);applicationEventPublisher.publishEvent(new MyEvent("new event " + id + " at " + System.currentTimeMillis()));id++;}@Overridepublic void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {this.applicationEventPublisher = applicationEventPublisher;}
}

订阅

实现org.springframework.context.ApplicationListener,注入到spring容器中。在泛型中指定需要监听的事件类型

/*** 订阅方*/
@Component
public class MyListener implements ApplicationListener<MyEvent> {@Overridepublic void onApplicationEvent(MyEvent event) {System.out.println("receive a event. msg : " + event.getMsg());}
}

测试结果:

publish event. id: 0
receive a event. msg : new event 0 at 1733368770009
publish event. id: 1
receive a event. msg : new event 1 at 1733368800008
publish event. id: 2
receive a event. msg : new event 2 at 1733368830011
publish event. id: 3
receive a event. msg : new event 3 at 1733368860007

其他事件监听方式

使用注解@EventListener

@Component
public class MyListener2 {@EventListenerpublic void onApplicationEvent(MyEvent event) {System.out.println("receive a event. msg : " + event.getMsg());}
}

其他

  1. 整个发布流程是同步的还是异步的?
    默认同步的。发布方和订阅方共用一个线程。
// 发布public void publish() {id++;System.out.printf("publish event start. id: %s. threadName: %s %n", id, Thread.currentThread().getName());applicationEventPublisher.publishEvent(new MyEvent("new event " + id + " at " + System.currentTimeMillis()));System.out.printf("publish event start. id: %s. threadName: %s %n", id, Thread.currentThread().getName());}// 订阅@EventListenerpublic void onApplicationEvent(MyEvent event) throws InterruptedException {sleep(5000);System.out.printf("receive a event. msg : %s. threadName: %s %n", event.getMsg(), Thread.currentThread().getName());}// 测试结果
// publish event start. id: 1. threadName: scheduled-task-thread2 
// receive a event. msg : new event 1 at 1733369970012. threadName: scheduled-task-thread2 
// publish event start. id: 1. threadName: scheduled-task-thread2
  1. 如何异步消费事件
    给订阅方上增加@Async注解,这样需要每次增加订阅方都增加注解
  2. 如何保证消费顺序
    当一个事件有多个消费者时,如果需要保证消费次序,可以使用注解@Order
  3. MQ和spring event的区别
    MQ更适合于应用级别的解耦,而spring event适用于应用内的解耦,更轻量
    相对MQ而言,spring event在系统故障时,由于数据是存在内存,会发生数据丢失
  4. 适用场景
  • 业务逻辑解耦。例如用户下单成功后,会触发库存减少、订单创建、支付请求等动作
  • 异步执行。适用于一些发布端不需要关心消费端如何处理,或异步线程不需要堵塞主线程的场景。如日志打印

相关新闻

  • 题解:CF2121E Sponsor of Your Problems
  • Python因果分析选哪个?六个贝叶斯推断库实测对比(含代码示例)
  • 实用指南:学习日报 20251007|深度解析:基于 Guava LoadingCache 的优惠券模板缓存设计与实现

最新新闻

  • 大连家电维修平台推荐:本地用户实测较好的几家服务商深度对比——2026年6月最新发布 - 一步到家
  • 3步解锁老旧Mac新生命:OpenCore Legacy Patcher终极升级指南
  • 2026宜昌非急救转运救护车TOP5盘点|宜荆荆同城、长江跨江、三峡山地、院区转诊首选康跃转运 - 吉修匠
  • 2026年湖北百合种植基地推荐排行榜:百合技术/百合回收/百合种苗案例参考 - 新闻快传
  • 告别龟速与超时:全方位解决 git clone 网络难题的实战指南
  • 嵌入式MCU电气特性与FLASH操作深度解析:从数据手册到稳定设计

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号