目录
一、简介
这篇文章介绍一下事件驱动相关内容,首先看一个场景,假如有一个系统,用户注册后需要给用户发送邮箱、短信等欢迎提醒,同时还需要给用户发送首条站内短消息,如果让你做这个功能你会怎么做,你可能会觉得这还不简单吗,把这三个功能封装成相应的方法,然后用户注册后分别调一下不就可以了。
的确这种方式是可以实现,后期可能会加新的需求,继续在后边调用其他功能方法,最后你发现这调来调去没完了,可能用户注册后边跟了 n 个方法的调用,很恶心,于是需要优化一下,你怎么解决呢?
这时可以使用事件驱动架构,当然你也可以通过消息中间件实现,但是这种方式相对较重,这里重点介绍一下事件驱动。
二、Spring Events
事件驱动是一种编程范式,其中程序的执行是由外部事件触发的,而不是通过预先定义好的顺序执行的。在这种模式下,程序不断地监听事件源,当检测到事件发生时,就会执行相应的代码。
Spring 内部提供了这种事件驱动的机制,那就是 Spring Events,它是观察者设计模式的实现。它增强了不同组件之间的通信,超越了传统的方法调用,并且基于松耦合架构,实现了解耦,减少了模块间的依赖。
Spring Events 的核心是三个组件:事件、发布者和监听器。
定义事件时需要实现 ApplicationEvent,事件在发布者和监听器之间传输数据。发布者创建此事件对象并使用 ApplicationEventPublisher 来发布它,监听器可以通过多种方式来实现,如注释(@EventListener)或实现 ApplicationListenter接口。
三、案例
下面就来实现一下上面提到的用户注册的案例。
首先是定义事件
public class UserDTO extends ApplicationEvent {
private Integer userId;
private String name;
private Integer age;
/**
* Create a new {@code ApplicationEvent}.
*
* @param source the object on which the event initially occurred or with
* which the event is associated (never {@code null})
*/
public UserDTO(Object source) {
super(source);
}
}
定义三种不同的事件监听器
// 发送短信的监听器
@Component
public class UserRegisterSmsListener implements SmartApplicationListener {
@Override
public boolean supportsEventType(Class<? extends ApplicationEvent> eventType) {
return eventType == UserDTO.class;
}
@Override
public int getOrder() {
return 1;
}
@Override
public void onApplicationEvent(ApplicationEvent event) {
// 这里完成短信发送
System.out.println("监听到用户注册,准备发送短信, user:" +