SpringBoot自定义事件发布

1、自定义事件

Spring中自定义事件需要继承ApplicationEvent

/**
 * 自定义事件,继承ApplicationEvent
 */
@Data
public class MailSendEvent extends ApplicationEvent {
    private String to;
    private String message;

    public MailSendEvent(Object source, String to, String message) {
        super(source);
        this.to = to;
        this.message = message;
    }
}

2、监听器

监听器用来监听事件触发,一旦事件触发了,监听器会执行相应的操作

监听器的实现有两种方式:

  • 实现ApplicationListener接口
  • 使用@EventListener注解

1)、实现ApplicationListener接口

/**
 * 自定义监听器,实现ApplicationListener接口,指定的泛型就是需要监听的事件
 */
@Component
@Slf4j
public class MailSendListener implements ApplicationListener<MailSendEvent> {

    @Override
    public void onApplicationEvent(MailSendEvent event) {
        log.info("MailSendEvent事件启动了...");
        log.info("向{}发送邮件,邮件内容为:{}", event.getTo(), event.getMessage());
    }
}

2)、使用@EventListener注解

@Component
@Slf4j
public class MailSendListener {

    /**
     * 可以不指定classes,默认监听的是方法参数中的事件
     *
     * @param event 事件源
     */
    @EventListener(classes = {MailSendEvent.class})
    public void handleMailSendEvent(MailSendEvent event) {
        log.info("MailSendEvent事件启动了...");
        log.info("向{}发送邮件,邮件内容为:{}", event.getTo(), event.getMessage());
    }
}

3、Spring的事件发布类

@Slf4j
@Component
public class MailSender {
    @Autowired
    private ApplicationEventPublisher applicationEventPublisher;

    /**
     * 发布事件
     *
     * @param event 指定的事件
     */
    public void publishEvent(MailSendEvent event) {
        applicationEventPublisher.publishEvent(event);
    }
}

4、测试类

    @Autowired
    private MailSender mailSender;

    @Test
    public void test() {
        mailSender.publishEvent(
                new MailSendEvent(this, "tom", "hello world"));
    }

5、异步事件

前面创建的事件和监听器都是同步进行,我们可以使用异步事件

1)使用@EnableAsync注解在配置类上开启异步功能

2)在监听方法上标注@Async,使得事件异步执行

@Component
@Slf4j
public class MailSendListener {

    /**
     * 可以不指定classes,默认监听的是方法参数中的事件
     *
     * @param event 事件源
     */
    @Async
    @EventListener(classes = {MailSendEvent.class})
    public void handleMailSendEvent(MailSendEvent event) {
        log.info("MailSendEvent事件启动了...");
        log.info("向{}发送邮件,邮件内容为:{}", event.getTo(), event.getMessage());
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章