![从企业级开发到云原生微服务: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=1739275604-ncx4oUWYgIJ9TrLr3xjIJYG92zBYVe52-0-4c0569d3ce3306e559dfc8a126bf0163)
发布者:
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_72_02.jpg?sign=1739275604-O7WqbXDY4DmyTdYwPvZAoguaczuzTNu0-0-80d2095e72737f8bfc7b4649eaf7293c)
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_73_01.jpg?sign=1739275604-iNrCndtJUqAbEPiH92lcbF5QBrlnHzTz-0-9feb810305849e59292b846040aee6a8)
监听者:
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_73_02.jpg?sign=1739275604-LY4IPKFEav10CfSWw2vhkF6np39SiOQa-0-7b65a6d0c400c6cc018bebfdfd228d5d)
a.EventListenerService实现了ApplicationListener<MessageEvent>接口,泛型MessageEvent可缩小监听事件的范围,通过覆写onApplicationEvent方法来监听事件。
监听者还可以注解@EventListener方法来监听事件。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_73_03.jpg?sign=1739275604-IzcRGj2Xchk95kvWMa2Umlz4kMh6H1d0-0-43be6529487a7d2e84c22c4a2222597a)
推荐使用@EventListener注解方式,耦合度更低。
除能监听自定义发布的事件外,还可以监听系统发布的事件,示例如下。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_73_04.jpg?sign=1739275604-wqvjq0WbKorx6hkBC3qGLqAjujEU7gMY-0-c2505a08f4a0d14853875c3aa3d858c4)
主要的系统事件如下。
◎ContextRefreshedEvent:当ApplicationContext被初始化或刷新时发布该事件。
◎ContextStartedEvent:当ApplicationContext开始时发布该事件。
◎ContextStoppedEvent:当ApplicationContext停止时发布该事件。
◎ContextClosedEvent:当ApplicationContext关闭时发布该事件。