ApplicationEvent:观察者模式的spring实现
所以我们可以直接注入使用,也可以使用ApplicationContext,因为ApplicationContext本身就继承了ApplicationEventPublisher。定义监听类,使用@TransactionalEventListener注解定义事务阶段,因为使用了注解,就不用继承ApplicationListener接口。1、开发ApplicationEvent事件:要发送的消息体,这
ApplicationEvent和 ApplicationListener,这是一种基于观察者模式实现事件监听功能。
有两个重要的类,一个是事件,一个是监听。事件要继承ApplicationEvent类,监听要实现ApplicationListener接口。如果使用了@TransactionalEventListener就不需要实现接口了。
推送事件需要使用ApplicationEventPublisher。这个对象在Spring容器加载的时候就已经在容器中了。所以我们可以直接注入使用,也可以使用ApplicationContext,因为ApplicationContext本身就继承了ApplicationEventPublisher。
总结:
1、开发ApplicationEvent事件:要发送的消息体,这个一般要根据我们的实际业务进行封装,需要什么类型的数据,就是用什么类型,需要哪些字段就添加哪些字段。
2、开发监听器:使用注解@TransactionalEventListener。当有事件推送过来就能执行。
3、推送事件ApplicationEventPublisher
在业务类注入ApplicationEventPublisher对象,将事件推送到事件类。
//业务类
@Service
public class Demo {
@Autowired
private ApplicationEventPublisher eventPublisher;
public void Test() {
Map<String, Object> objectMap = new HashMap<>();
objectMap.put("k", "v");
eventPublisher.publishEvent(new EventDemo(objectMap));
}
}
定义事件类
// 定义事件类
// 继承 ApplicationEvent
public class EventDemo extends ApplicationEvent {
public EventDemo (Object source) {
super(source);
}
}
定义监听类,使用@TransactionalEventListener注解定义事务阶段,因为使用了注解,就不用继承ApplicationListener接口。监听器会一直监听事件类类型的事件,当spring容器发布一个事件实例时,且当前事务处于提交后阶段,这个监听器才会被调用
@Service
public class ListenerDemo {
// - 查找所有监听器中声明了监听 EventDemo 类型的方法
// - 检查条件(@TransactionalEventListener 还会检查事务状态)
// - 符合条件的监听器方法被调用
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
pulbic void Demo(EventDemo demo) {
//将事件提交后发送邮件
//你的业务代码
}
}
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)