本篇介绍如果通过Spring的事件模型来实现设计模型中的观察者模式。
1、创建业务相关的 Event 事件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
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
|
@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
|
@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的值越小,优先级越高。