一、介绍
(1)ApplicationEventPublisherAware
ApplicationEventPublisherAware 是由 Spring 提供的用于为 Service 注入 ApplicationEventPublisher 事件发布器的接口,使用这个接口,我们自己的 Service 就拥有了发布事件的能力。
用户注册后,不再是显示调用其他的业务 Service,而是发布一个用户注册事件。
(2)ApplicationListener
ApplicationListener接口是由 Spring 提供的事件订阅者必须实现的接口,我们一般把该 Service 关心的事件类型作为泛型传入。处理事件,通过 event.getSource() 即可拿到事件的具体内容
(3)ApplicationEventPublisher
ApplicationEventPublisher是ApplicationContext的父接口之一。这接口的作用是:Interface that encapsulates event publication functionality.
功能就是发布事件,也就是把某个事件告诉的所有与这个事件相关的监听器。
二、示例
发送接口:
/**
* @program: cz-parent
* @description:
* @author: shuonar
* @create: 2021-01-14 13:30
**/
public interface SmsService {
void sendCode(String tel, String code);
}
实现事件发布:
/**
* @program: cz-parent
* @description:
* @author: shuonar
* @create: 2021-01-14 13:31
**/
@Service
public class SmsServiceImpl implements SmsService {
@Resource
private ApplicationEventPublisher applicationEventPublisher;
@Override
public void sendCode(String tel, String code) {
CodeDTO codeDTO = new CodeDTO(code, tel);
applicationEventPublisher.publishEvent(codeDTO);
}
}
订阅:
/**
* @program: cz-parent
* @description: SmsEvent
* @author: shuonar
* @create: 2021-01-14 13:38
**/
@Component
public class SmsEvent {
@Async
@EventListener
public void handle(CodeDTO codeDTO){
try{
Thread.sleep(5000);
System.out.println("监听器接收数据---" + codeDTO.getTel() + ":" + codeDTO.getCode());
}catch (Exception e){
}
}
@Async
@EventListener
public void handleNone(String codeDto){
System.out.println("监听器接收数据---" + codeDto);
}
}
调用:
@RequestMapping("/sendCode")
public String sendCode(){
SmsService smsService = this.applicationContext.getBean(SmsService.class);
smsService.sendCode("13608236872", "111222");
return "成功发送验证码";
}
结果:
监听器接收数据---13608236872:111222