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());
}
}