SpringBoot事件发布和监听详解

网友投稿 961 2022-11-23

SpringBoot事件发布和监听详解

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 {

@Override

uWZmMS public void onApplicationEvent(MyTestEvent myTestEvent) {

System.out.println("MyTestListener : " + myTestEvent.getUser());

}

}

使用@EventListener注解配置

@Component

public class MyTestListener2{

@EventListener(MyTestEvent.class)

public void onApplicationEuWZmMSvent(MyTestEvent myTestEvent) {

System.out.println("MyTestListener2:" + myTestEvent.getUser());

}

}

总结

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:[leetcode] 522. 最长特殊序列 II 暴力 + 双指针
下一篇:用YOLOv5模型识别出表情!
相关文章

 发表评论

暂时没有评论,来抢沙发吧~