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) {
    //将事件提交后发送邮件
    //你的业务代码
    }
}

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐