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());
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章