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