ApplicationEvent用监听对象的创建并处理接下来的业务逻辑,是观察者模式的应用
接下来简单演示下其用法及进阶用法,首先ApplicationEvent本身是同步的
public class DemoEvent extends ApplicationEvent {
private String msg;
public DemoEvent(Object source,String msg) {
super(source);
this.msg = msg;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
@Component
public class DemoPublisher {
@Autowired
ApplicationEventPublisher publisher;
public void publish(String msg){
publisher.publishEvent(new DemoEvent(this,msg));
}
}
@Component
public class DemoListener{
@EventListener(DemoEvent.class)
public void taskHandler(DemoEvent demoEvent) {
String msg = demoEvent.getMsg();
.....//消息处理
}
}
@RestController
@Slf4j
public class controller {
@Autowired
DemoPublisher demoPublisher;
@GetMapping("test")
public void GetUser(){
demoPublisher.publish("hello application event");
}
}
其中Listener可以有多个,自定义顺序可以使用@Order注解
如果想实现异步发送消息的功能就得加上@Async注解了
@Component
@EnableAsync
public class DemoListener{
@EventListener(DemoEvent.class)
@Async
public void taskHandler(DemoEvent demoEvent) {
String msg = demoEvent.getMsg();
.....//消息处理
}
}
Spring还提供了一个关于事务的处理
其中phase 有四个值可以选
AFTER_COMMIT,BEFORE_COMMIT,AFTER_ROLLBACK,AFTER_COMPLETION
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
还有一个fallbackExecution属性代表没有事务的时候是否应该执行,默认为false,即是必须是有事务的时候才会执行
因此@TransactionalEventListener注解需要配合事务一起使用
@GetMapping("test")
@Transactional
public void GetUser(){
demoPublisher.publish("hello application event");
}
@Component
public class DemoListener{
@TransactionalEventListener(classes = DemoEvent.class, phase = TransactionPhase.AFTER_COMMIT)
public void taskHandler(DemoEvent demoEvent) {
String msg = demoEvent.getMsg();
.....//消息处理
}
}
注:@TransactionalEventListener没必要和@Async一同使用,因为事务操作完毕意味着方法执行结束了,配合使用时异步功能是开启不了的
网友评论