SpringBoot中事件的使⽤
项⽬中很多场景可以使⽤事件来对系统进⾏解耦,让系统更便于维护和扩展。SpringBoot项⽬默认是⽀持事件的,我们只需要⾃定义事件,然后发布事件,之后监听事件处理业务逻辑即可。SpringBoot中我们会⽤到事件抽象类ApplicaltionEvent,事件监听接⼝ApplicationListener,事件发布接⼝ApplicationEventPublisher。
本⽂基于⽤户注册成功之后发送短信以及邮件功能作为业务场景,将⽤户注册成功作为事件,模拟发送短信以及发送邮件作为⽤户注册成功事件的监听器。
定义事件
梅西英文名
草菇的种植技术⾸先定义注册⽤户成功事件UrRegisterEvent,该事件继承ApplicationEvent抽象类,事件中定义了⽤户信息,当监听器监听事件后可以直接使⽤事件中的⽤户信息,代码如下:
public class UrRegisterEvent extends ApplicationEvent {
private static final long rialVersionUID = 1L;
private UrModel ur;
全国企业信用系统
public UrRegisterEvent(Object source, UrModel ur) {
super(source);
this.ur = ur;
}
public UrModel getUr() {
return ur;
}
}
定义事件监听器
蒜苔炒木耳
⽤户注册成功之后,需要发送短信和邮件,发送短信和邮件我们分别定义不同的事件监听器处理各⾃的业务逻辑,这⾥我们使⽤实现接⼝ApplicationListener的⽅式作为监听器,SpringBoot中也可以使⽤@EventListener注解的⽅式。使⽤实现接⼝ApplicationListener的⽅式需要将实现类交给Spring管理,
所以需要使⽤@Component注解进⾏注册。默认情况下使⽤的是同步的⽅式,如果需要启⽤异步需要在onApplicationEvent⽅法上加上@Async注解。
发送短信监听器的实现代码如下:
@Component
public class UrRegisterSendSMSListener implements ApplicationListener<UrRegisterEvent> {
private static final Logger LOGGER = Logger(UrRegisterSendSMSListener.class);
@Override
public void onApplicationEvent(UrRegisterEvent urRegisterEvent) {
// 发送短信
LOGGER.info("新注册⽤户 {} 短信发送成功", Ur().getUrName());
}
}
发送邮件监听器的实现代码如下:
@Component
国际田径联合会public class UrRegisterSendEmailListener implements ApplicationListener<UrRegisterEvent> {
private static final Logger LOGGER = Logger(UrRegisterSendEmailListener.class);
@Override
public void onApplicationEvent(UrRegisterEvent urRegisterEvent) {
// 发送短信
微微一笑很倾城插曲LOGGER.info("新注册⽤户 {} 邮件发送成功", Ur().getUrName());
}
}
⽤户注册成功之后发送短信和邮件,这⾥我们只是模拟在⽇志中打出想要的发送⽇志,真实业务可能需要调⽤第三⽅接⼝发送短信以及邮件。
发布事件
我们⾃定了⽤户注册事件,以及发送短信和发送邮件监听器。现在我们需要发⽤户注册事件发布出去,相应的监听器监听到⽤户注册成功事件后才能处理各⾃的业务(发送短信以及发送邮件)。使⽤SpringBoot提供的事件发布接⼝ApplicationEventPublisher,在⽤户注册成功后,直接将⽤户注册成功事件发布出去。代码如下:
@RestController
@RequestMapping("ur")
public class UrController {
@Autowired
private ApplicationEventPublisher applicationEventPublisher;
@PostMapping
public String register(@RequestBody UrModel model) {
// 验证
// 注册
// 事件
昨天已成过去UrRegisterEvent urRegisterEvent = new UrRegisterEvent(this, model);
applicationEventPublisher.publishEvent(urRegisterEvent);
return String();
公路运输管理}
}
测试
⾄此基于SpringBoot的⾃定义事件整个流程已经开发完成,运⾏项⽬调⽤注册接⼝,⽇志中分别打出了发送短信以及发送邮件的⽇志。
总结