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