温故知新04-Spring之ApplicationEventPublisher

一、介绍
(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

你可能感兴趣的:(温故知新04-Spring之ApplicationEventPublisher)