SpringBoot事件发布和监听详解
作者:ForeverKobe 发布时间:2022-04-18 02:39:59
标签:springboot,事件发布,监听
目录
概述
事件监听的结构
Publisher,Event和Listener的关系
事件
发布者
监听者
总结
概述
ApplicationEvent以及Listener是Spring为我们提供的一个事件监听、订阅的实现,内部实现原理是观察者设计模式,设计初衷也是为了系统业务逻辑之间的解耦,提高可扩展性以及可维护性。事件发布者并不需要考虑谁去监听,监听具体的实现内容是什么,发布者的工作只是为了发布事件而已。事件监听的作用与消息队列有一点类似。
事件监听的结构
主要有三个部分组成:
发布者Publisher
事件Event
监听者Listener
Publisher,Event和Listener的关系
事件
我们自定义事件MyTestEvent继承了ApplicationEvent,继承后必须重载构造函数,构造函数的参数可以任意指定,其中source参数指的是发生事件的对象,一般我们在发布事件时使用的是this关键字代替本类对象,而user参数是我们自定义的注册用户对象,该对象可以在监听内被获取。
@Getter
public class MyTestEvent extends ApplicationEvent {
private static final long serialVersionUID = 1L;
private User user;
public MyTestEvent(Object source, User user) {
super(source);
this.user = user;
}
}
发布者
事件发布是由ApplicationContext对象管控的,我们发布事件前需要注入ApplicationContext对象调用publishEvent方法完成事件发布。
ApplicationEventPublisher applicationEventPublisher 虽然声明的是ApplicationEventPublisher,但是实际注入的是applicationContext
@RestController
@RequestMapping("/test")
public class TestController {
@Autowired
ApplicationContext applicationContext;
@Autowired
ApplicationEventPublisher applicationEventPublisher;
@GetMapping("testEvent")
public void test() {
applicationEventPublisher.publishEvent(new MyTestEvent("dzf-casfd-111", new User("dzf-625096527-111", "xiaoming", 19)));
applicationEventPublisher.publishEvent(new MyTestEvent("dzf-49687489-111", new User("dzf-625096527-111", "xiaowang", 20)));
}
}
监听者
面向接口编程,实现ApplicationListener接口
@Component
public class MyTestListener implements ApplicationListener<MyTestEvent> {
@Override
public void onApplicationEvent(MyTestEvent myTestEvent) {
System.out.println("MyTestListener : " + myTestEvent.getUser());
}
}
使用@EventListener注解配置
@Component
public class MyTestListener2{
@EventListener(MyTestEvent.class)
public void onApplicationEvent(MyTestEvent myTestEvent) {
System.out.println("MyTestListener2:" + myTestEvent.getUser());
}
}
来源:https://juejin.cn/post/7028735647389057032
0
投稿
猜你喜欢
- xxx cannot be resolved to a type引言 eclipse新导入的项目经常可以
- 上一篇介绍了Tesseract库的使用(OCR库Tesseract初探),文末提到了Tesseract是用c/c++开发的,也有C#的开源版
- 一、首先将网页内容整个抓取下来,数据放在byte[]中(网络上传输时形式是byte),进一步转化为String,以便于对其操作,实例如下:p
- 本文实例汇总了DevExpress SplitContainerControl的用法,希望对大家进行C#项目开发能起到一定的帮助作用。具体用
- 下面是我的实现经历:1.首先,我是直接使用AlertDialog来实现,确定是,形状有点难看,而且获得Dialog里面的控件略显麻烦(因为我
- android在网络上下载文件,供大家参考,具体内容如下步骤: 1.使用HTTP协议下载文件- 创建一个HttpURLConnection对
- 本文介绍了android视频截屏&手机录屏实现代码,分享给大家,希望对大家有帮助问题在android中有时候我们需要对屏幕进行截屏操
- 本文栈长教你如何在 Spring Boot 注册 Servlet、Filter、Listener。一、Spring Boot 注册Sprin
- 先看看效果图:源码下载:Android Navigation TabBar控件实现多彩标签栏代码:MainActivity.javapack
- 最近部门打算优化下 APP 在低端机上的卡顿情况,既然想优化,就必须获取卡顿情况,那么如何获取卡顿情况就是本文目的。一般主线程过多的 UI
- Q:使用过滤器、 * 与切片实现每个请求耗时的统计,并比较三者的区别与联系过滤器Filter 过滤器概念Filter是J2E中来的,可以看做
- 本文讲述了Android应用程序模型之应用程序,任务,进程,线程。分享给大家供大家参考,具体如下:大多数操作系统,在应用程序所寄存的可执行程
- 一、介绍在日常的 web 开发中,熟悉 java 的同学一定知道,Spring MVC 可以说是目前最流行的框架,之所以如此的流行,原因很简
- Android Material Design:PopupMenuAndroid Material Design 引入的PopupMenu类
- 其实我觉得最主要还是开发者对于应用的优化不够,太多的Overdraw和Layout方面的问题,Android开发者本身为了适配屏幕分辨率和解
- 1. 概述官方JavaDocsApi: javax.swing.JLabelJLabel,标签。标签主要用于展示 文本 或 图片,也可以 同
- 直接看代码,注释都写清楚了public class MainActivity extends Activity { private
- 今天重新装了编译器,结果崩无极限,真是日了狗了了。刚刚才知道问题在哪边。好了,说正事,对于ios开发我没接触,不是很了解,百度了半天,差不多
- 实际需求<if test="computationRule == '1'"> F
- Java Double相加出现的怪事问题的提出编译运行下面这个程序会看到什么public class test { public stati