![从企业级开发到云原生微服务:Spring Boot实战](https://wfqqreader-1252317822.image.myqcloud.com/cover/257/33831257/b_33831257.jpg)
3.5 Bean之间的事件通信
如果Bean之间需要通信,比如说BeanA完成了处理后需要告知BeanB,通知BeanB继续处理,那么我们称BeanA为Publisher,称BeanB为Listener。
Publisher和Listener之间传递的事件数据通过继承ApplicationEvent来实现。
Publisher的实现方式如下。
◎通过ApplicationEventPublisherAware注入ApplicationEventPublisher发布事件,前面已演示。
◎直接注入ApplicationEventPublisher发布事件。
◎直接注入ApplicationContext发布事件。
Listener的实现方式如下。
◎实现ApplicationListener接口。
◎注解@EventListener的方法接收事件。
事件数据:
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_72_01.jpg?sign=1738887910-xgvrsAi0AIAZYOPWy6yZb7TQg9ou4lMy-0-57a398b179770c9fb431906c7e94edec)
发布者:
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_72_02.jpg?sign=1738887910-lTuIAwkVwt4Negf2D0G2iGCLZEwSCjvW-0-9119b4b529eeab8b624951c2f73e4489)
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_73_01.jpg?sign=1738887910-nsFp1EHdYRp6VNifCz59NmHNZxPWUzGE-0-48723194aa087e16f3414c22c3b8bc23)
监听者:
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_73_02.jpg?sign=1738887910-jNsagidlMZO8wnXW0yQQQpzLb7G7vs5p-0-4eb1950285567750282eb17304be99bd)
a.EventListenerService实现了ApplicationListener<MessageEvent>接口,泛型MessageEvent可缩小监听事件的范围,通过覆写onApplicationEvent方法来监听事件。
监听者还可以注解@EventListener方法来监听事件。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_73_03.jpg?sign=1738887910-gENg4ECQnO6OnLaDvRbmwOJ50bl7oAnS-0-1d92009afc72f9b81658e36c6a847692)
推荐使用@EventListener注解方式,耦合度更低。
除能监听自定义发布的事件外,还可以监听系统发布的事件,示例如下。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_73_04.jpg?sign=1738887910-LAHiF9b2AQAVMy5ESoNXSxhUIpySGY8r-0-400418482460f1ce1fc0417254a44ca1)
主要的系统事件如下。
◎ContextRefreshedEvent:当ApplicationContext被初始化或刷新时发布该事件。
◎ContextStartedEvent:当ApplicationContext开始时发布该事件。
◎ContextStoppedEvent:当ApplicationContext停止时发布该事件。
◎ContextClosedEvent:当ApplicationContext关闭时发布该事件。