springboot 事件监听与发布
springboot 事件发布与监听大致分为三块
事件定义
定义自己的事件类,继承 ApplicationEvent
事件发布
注入事件发布类 ApplicationEventPublisher,使用 publishEvent 方法发布相应的事件
事件监听
实现 ApplicationListener 接口,实现 onApplicationEvent 方法或者使用注解 @EventListener 进行事件监听
例子:
1.事件定义
public class StudentEvent<T> extends ApplicationEvent {
private T data;
public StudentEvent(T source) {
super(source);
this.data = source;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
2.事件发布
public class TestController {
private static final Logger LOGGER = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
private final ApplicationEventPublisher applicationEventPublisher;
public TestController(ApplicationEventPublisher applicationEventPublisher) {
this.applicationEventPublisher = applicationEventPublisher;
}
@PostMapping("/addStudent")
public String test(@RequestBody Student student){
LOGGER.info("新增的学生信息:"+student.toString());
applicationEventPublisher.publishEvent(new StudentEvent<>(student));
return "success";
}
}
3.事件监听
@EventListener
public void addStudentListener1(StudentEvent<Student> studentTestEvent){
LOGGER.info("监听到的信息1:"+studentTestEvent.getData());
}
扩展:
一个事件可以有多个事件的监听,可以像下面这样有多个监听的方法来做业务处理逻辑,如果我们需要定义每一个监听方法的执行顺序,可以使用 @order 注解来进行定义。
@order 注解的值传入的越小,执行顺序优先。
@EventListener
@Order(1)
public void addStudentListener1(StudentEvent<Student> studentTestEvent){
LOGGER.info("监听到的信息1:"+studentTestEvent.getData());
}
@EventListener
@Order(3)
public void addStudentListener3(StudentEvent<Student> studentTestEvent){
LOGGER.info("监听到的信息3:"+studentTestEvent.getData());
}
@EventListener
@Order(2)
public void addStudentListener2(StudentEvent<Student> studentTestEvent){
LOGGER.info("监听到的信息2:"+studentTestEvent.getData());
}
注意
1、事件监听类需要被 spring 进行管理
2、事件的发布和监听操作是同步执行的,如果有事务,监听操作也会在事务内
3、同一个发布的事件是可以有多个监听的方法的