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

news/2024/10/18 16:49:57/

前言:

上一篇我们分析了 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 ,否则就无法使用。

java">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 注解。

java">@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 方法完成事件发布。

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

触发事件,完成验证

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

java">@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 注解,代码如下:

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

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


http://www.ppmy.cn/news/1474232.html

相关文章

《妃梦千年》第二十八章:反间之计

第二十八章&#xff1a;反间之计 在经历了一系列的斗争和变故后&#xff0c;林清婉意识到&#xff0c;宫中的敌人和外部的敌人正在联手&#xff0c;他们不仅试图从外部攻破大周的防线&#xff0c;还在内部制造混乱。为了彻底解决这个问题&#xff0c;她决定采取反间之计&#…

华为HCIP Datacom H12-821 卷32

1、默认情况下&#xff0c;IS-IS Leve1-1-2路由器会将Leve1-2区域的明细路由信息发布到Level-1区域、保证level-1区域的路由器能够正常访问骨干区域的设备 A、对 B、错 正确答案&#xff1a; B 解析&#xff1a;不会发布&#xff0c;需要用到路由泄露。 2、BGP在建立邻居…

看影视学英语(假如第一季第一集)

in the hour也代表一小时吗&#xff1f;等同于in an hour&#xff1f;

【LInux】从动态库的加载深入理解页表机制

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

Linux多进程和多线程(八)多线程

多线程 线程定义线程与进程线程资源 线程相关命令 pidstat 命令 top 命令ps 命令常见的并发方案 1. 多进程模式2. 多线程模式 创建线程 1. pthread_create() 示例:创建一个线程 2. pthread_exit() 退出线程3. pthread_join() 等待线程结束 示例: 线程分离 创建多个线程 示例 1:…

UI组件库---vantList组件接口多次调用大坑问题

问题描述&#xff1a;当使用refesh下拉操作时&#xff0c;vanlist组件会多次调用&#xff08;大概三次&#xff09;&#xff01; 解决方案&#xff1a; 1、接口错误的时候&#xff0c;大量重复请求。 可能接口错误时vant3内部某些变量没重置&#xff0c;导致一直重复请求&am…

Build a Large Language Model (From Scratch)附录D(gpt-4o翻译版)

来源&#xff1a;https://github.com/rasbt/LLMs-from-scratch?tabreadme-ov-file https://www.manning.com/books/build-a-large-language-model-from-scratch

JMH324-免费【最后一战LOL】MOBA竞技版本+单机一键端+视频教程+文本教程

资源介绍&#xff1a; 修改前打开【D:\ZHServer】文件夹里的【[1]一键启动.bat】&#xff0c;游戏不要打开&#xff0c;否则修改失败。 修改完以后重启架设程序才会生效。 fball_gamedb1数据库——gameuser数据表 obj_name 角色名 obj_lv 等级 obj_diamond 钻石 obj_gold 8…