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

Spring Boot 事件监听机制实战【自定义 Spring Boot 事件监听】

前言:

上一篇我们分析了 Spring Boot 事件监听的原理,本篇我们来自定义实现自己的监听器。

Spring Boot 系列文章传送门

Spring Boot 启动流程源码分析(2)

Spring Boot 启动流程源码分析(2)

Spring Boot 自动配置实现原理(源码分析)

Spring Boot 自定义 starter 启动器

Spring Boot 事件监听机制工作原理

Spring Boot 自定义监听器

创建 Spring Boot 自定义监听器通常要经过一下步骤

  1. 定义事件。
  2. 定义事件监听器。
  3. 定义事件发布器。
  4. 触发事件,完成验证。

定义事件

定义 Event 事件,MyEvent 继承了 ApplicationEvent 类,如果我们要使用 Spring 的事件监听机制,那我们定义的 Event 事件必须继承ApplicationEvent ,否则就无法使用。

public class MyEvent extends ApplicationEvent {private final String event;public MyEvent(Object source, String event) {super(source);this.event = event;}public String getEvent() {return event;}}

定义事件监听器

事件监听器实现了 ApplicationLister 接口,泛型为 ApplicationEvent,因为要监听事件,所以必须按照 Spring 的规则来,onApplicationEvent 方法就是监听到的事件,在这里可以完成业务逻辑处理,因为事件监听器需要加入Spring IOC 容器中才能生效,因此 MyListener 使用了 @Component 注解。

@Slf4j
@Component
public class MyListener implements ApplicationListener<MyEvent> {@Overridepublic void onApplicationEvent(MyEvent myEvent) {//监听器调用事件方法String event = myEvent.getEvent();log.info("event:{}",event);}
}

定义事件发布器

Sprin Boot 监听器要生效,必须要有一个时间发布器,自定了一个事件发布器,注入了 ApplicationEventPublisher,使用 ApplicationEventPublisher#publishEvent 方法完成事件发布。

@Component
public class MyPublisher {@Resourceprivate ApplicationEventPublisher applicationEventPublisher;public void publish(){applicationEventPublisher.publishEvent(new MyEvent(new MyListener(),"publish event  test"));}
}

触发事件,完成验证

我们这里直接使用 Spring Boot 启动类来完成事件发布测试,如下:

@SpringBootApplication
public class MyStudySpringBootApplication {public static void main(String[] args) {ConfigurableApplicationContext context = SpringApplication.run(MyStudySpringBootApplication.class, args);MyPublisher publisher = context.getBean(MyPublisher.class);publisher.publish();}}

测试结果:

2024-06-30 21:35:42.926  INFO 29928 --- [main] com.my.study.start.listener.MyListener   : event:publish event  test

结果符合预期,这样我们就完成了一个简单的自定义事件监听,一般来说,我们在项目开发中是使用不到事件监听机制的,但是源码中大量使用了监听机制,因为我们还是需要了解监听器是怎样实现的。

自定义监听器的注解实现方式

使用 @EventListener 注解,代码如下:

@Slf4j
@Component
public class MyAnnotationListener {@EventListenerpublic void handleCustomEvent(MyEvent myEvent) {//监听器调用事件方法String event = myEvent.getEvent();log.info("event2:{}", event);}}

欢迎提出建议及对错误的地方指出纠正。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • MACOS查看硬盘读写量
  • 【JavaWeb程序设计】Servlet(二)
  • linux 内核 红黑树接口说明
  • 股票分析系统设计方案大纲与细节
  • 基于对称点模式SDP(SDP, symmetrized dot pattern)轴承故障诊断方法(matlab和python实现开源)
  • 高并发内存池联调问题
  • 链表 OJ(一)
  • LIO-SAM编译ubuntu20.04 Noetic
  • Python地图可视化三大秘密武器
  • 数智驱动丨zAIoT 连续落地军工、科研院所和机械制造场景,推动数智化转型升级...
  • base SAS programming学习笔记10(combine data)
  • java synchronized关键字介绍
  • Three 圆柱坐标(Cylindrical)和 视锥体(Frustum)
  • 聊一聊中小企业如何开展持续交付
  • 【C++修行之道】string类练习题
  • [译]Python中的类属性与实例属性的区别
  • 【347天】每日项目总结系列085(2018.01.18)
  • ➹使用webpack配置多页面应用(MPA)
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • Spring框架之我见(三)——IOC、AOP
  • SwizzleMethod 黑魔法
  • Transformer-XL: Unleashing the Potential of Attention Models
  • VUE es6技巧写法(持续更新中~~~)
  • vue-cli在webpack的配置文件探究
  • 程序员该如何有效的找工作?
  • 初识MongoDB分片
  • 经典排序算法及其 Java 实现
  • 线性表及其算法(java实现)
  • 消息队列系列二(IOT中消息队列的应用)
  • 学习ES6 变量的解构赋值
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • 湖北分布式智能数据采集方法有哪些?
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​secrets --- 生成管理密码的安全随机数​
  • ​卜东波研究员:高观点下的少儿计算思维
  • # windows 安装 mysql 显示 no packages found 解决方法
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • %@ page import=%的用法
  • (1)(1.13) SiK无线电高级配置(五)
  • (14)Hive调优——合并小文件
  • (3)llvm ir转换过程
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (ISPRS,2021)具有遥感知识图谱的鲁棒深度对齐网络用于零样本和广义零样本遥感图像场景分类
  • (阿里云万网)-域名注册购买实名流程
  • (笔试题)分解质因式
  • (二)延时任务篇——通过redis的key监听,实现延迟任务实战
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • (转)Sublime Text3配置Lua运行环境
  • (转)程序员技术练级攻略
  • (转)总结使用Unity 3D优化游戏运行性能的经验