Spring事件模型实现观察者模式

​ 本篇介绍如果通过Spring的事件模型来实现设计模型中的观察者模式。

1、创建业务相关的 Event 事件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
* @Author: knight
* @Description: 新用户注册事件
* @Date: Created in 2021/9/8 16:05
*/
public class UserRegisterEvent extends ApplicationEvent {
private final String userName;

public UserRegisterEvent(String userName) {
super(userName);
this.userName = userName;
}

public String getUserName() {
return userName;
}
}

2、定义不同的监听器(观察者)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* @Author: knight
* @Description: 新用户注册监听事件
* @Date: Created in 2021/9/8 16:07
*/
@Service
@Async
public class UserRegisterListener implements ApplicationListener<UserRegisterEvent> {
@Resource
private SmsService smsService;

@Override
public void onApplicationEvent(UserRegisterEvent userRegisterEvent) {
SmsMessage message = SmsMessage.builder().mobile(SmsConstant.ADMIN_MOBILE)
.type(SmsMessage.SMS_TYPE.SMS_USER_REGISTER)
.userName(userRegisterEvent.getUserName())
.build();
smsService.sendSmsMessage(message);
}
}

3、通过publishEvent 发布事件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
* @Description: 用户注册
* @Author: knight
* @Date: 2019/12/7 17:38
*/
@PostMapping("/register")
public CommonResult<String> register(String mobile, String code) {
// 用户注册逻辑
sysUserService.save(user);

// 发布注册事件
eventPublisher.publishEvent(new UserRegisterEvent(mobile));

return new CommonResult<>(CommonResultEmnu.OK);
}
1
2
@Resource
private ApplicationEventPublisher eventPublisher;

4、异步执行

如果需要异步执行,可以在具体 Listener 实现类上添加 @Async 注解,同时Application主类也需要添加@EnableAsync注解。

1
2
3
4
@Async
public class MyListener{

}
1
2
3
4
@EnableAsync
public class MyApplication {

}

5、多个观察者顺序消费

​ 可以通过@Order注解,实现多个观察者顺序消费,order的值越小,优先级越高。

作者

knight

发布于

2022-03-09

更新于

2022-03-09

许可协议

评论