使用Spring事件监听机制实现业务解耦
一.业务场景
假如咱们项目里面有这样一个场景,处理业务逻辑完需要发送一个邮件。
我们平常做法可以通过线程池提交一个异步任务或者通过CompletableFuture开启一个异步任务调用发送邮件方法,这里简单介绍一个新的方式来了解与使用Spring的事件发布与监听,了解这种机制有诸多方便!
二.Spring事件监听机制是什么?
1.相关概念
事件监听机制也是设计模式中观察者模式、发布-订阅模式的一种实现。
Spring的事件机制是A调用一个发布事件的方法,就能自动调用监听这个事件的方法B,这个过程有3个对象:
- 事件本身,其实就是一个对象,这个对象对应的类要继承Spring的ApplicationEvent,这样才能被Spring识别。
- 发布事件的对象,一般都是使用ApplicationContext的publishEvent方法来发布;
- 接收(或者叫监听)事件的对象,实现ApplicationListener 接口或者使用@EventListener注解的方法;
2.解耦
通常我们利用消息队列来实现不同系统之间的解耦,如用户注册完成后,可以向消息队列发布一条消息,然后订阅了此topic的子系统(如邮件服务,积分服务)收到发布的消息之后,就会做相应的处理。这样做的好处是避免了在注册服务里耦合其他服务的代码,并且,执行子系统的业务将会异步执行,互不影响, 使用事件发布与监听机制也可以做业务解耦。
三.使用步骤
1.定义事件
定义邮件事件本身,只管邮件发送
public class MailEvent extends ApplicationEvent {
public MailEvent(Object source) {
super(source);
}
public void sendMail() {
log.info("邮件发送中...");
}
}
2.发布事件
模拟处理业务逻辑,然后通过我们的Spring容器发布这个邮件事件,其内部就是通过Spring的事件发布器发布的事件。
@Autowired
private ApplicationContext applicationContext;
@GetMapping("/pub-event")
public void pub() {
log.info("业务逻辑处理中....");
applicationContext.publishEvent(new MailEvent(this));
}
3.侦听事件的对象
- 了解vue的小伙伴们应该知道watch侦听函数,侦听到对应的变量改变则触发侦听函数执行侦听器逻辑,一样的道理,这里是侦听器侦听到对应的事件则执行侦听器的逻辑。
- 通过实现ApplicationListener接口或者使用@EventListener注解来定义侦听器,这里定义了4