SpringEvent是允许不同组件之间通过发布-订阅机制进行解耦的通信,可以用来通知其它组件执行后续操作。
一、简单使用
1.创建一个 SpringEvent监听器
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
/**
* Event listener
* @author GodSea
*/
@Component
@Slf4j
public class SpringEventListener {
@EventListener
public void eventHandler(String event) {
log.info("事件处理:{}", event);
}
}
2.事件发送(单元测试)
@Test
void testEvent() {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
eventPublisher.publishEvent("事件测试");
}
3.执行结果
二、多个监听者
1.监听器
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
/**
* Event listener
* @author GodSea
*/
@Component
@Slf4j
public class SpringEventListener {
@EventListener
public void eventHandler1(String event) {
log.info("事件处理1:{}", event);
}
@EventListener
public void eventHandler2(Integer event) {
log.info("事件处理2:{}", event);
}
}
2.事件发送
@Test
void testEvent() {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
eventPublisher.publishEvent("字符串");
eventPublisher.publishEvent(21);
stopWatch.stop();
}
3.执行结果
三、总结
SpringEvent多个监听者是根据数据类型分类的,需要使用多个监听者,则应该使用不同类型的数据发送和监听,如果有相同数据类型的监听者,那么这些监听者都将会接收到事件。
例如:
// 监听者
@EventListener
public void eventHandler1(String event) {
log.info("事件处理1:{}", event);
}
@EventListener
public void eventHandler2(String event) {
log.info("事件处理2:{}", event);
}
// 事件发送
@Test
void testEvent() {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
eventPublisher.publishEvent("字符串");
stopWatch.stop();
}
执行结果:
如果监听者需要异步执行,例如一些业务处理后的数据更新,这些数据更新用户侧暂时不关注,则只需异步执行事件,想要实现这种异步执行,只需借助注解@Async即可实现。
例如:
// 监听者
@EventListener
@Async
public void eventHandler1(String event) {
log.info("事件处理1:{}", event);
}
@EventListener
public void eventHandler2(Integer event) {
log.info("事件处理2:{}", event);
}
// 事件发送
@Test
void testEvent() {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
eventPublisher.publishEvent("字符串");
log.info("事件 1 已发送");
eventPublisher.publishEvent(21);
log.info("事件 2 已发送");
stopWatch.stop();
}
执行结果: 事件1使用了异步执行