前言
日常开发中经常遇到一个业务发生之后需要触发好几个业务点,比如订单支付完成之后需要发送短信、送会员积分、发送优惠券等。在分布式系统中我们可以通过消息队列实现,各个系统之间订阅支付成功事件,然后实现各自的业务,达到一个系统之间的解耦和异步的目的。
如果在同一个进程中也存在类似的通知需求,通过消息队列显得太笨重而且也没有跨进程或者系统架构中都没引入消息队列。这时候要实现进程内的消息通讯就可以通过Spring自带的Event事件或者google的EventBus。
最近入职了一家新公司,里面用到了EventBus作为消息总线。本人之前都是用Spring Event去做事件解耦,所以现在通过学习,总结本篇作为EventBus的基础知识,实例,以及源码解析。
简介
EventBus
是适用于Android
和Java
的开源库,使用发布者/订阅者模式进行松散耦合。EventBus
使中央通信只需几行代码即可解耦类,从而简化了代码,消除了依赖关系并加快了应用程序的开发。(通俗理解,可以理解为同进程中的消息队列)
EventBus事件三部曲:Subscriber、Event、Publisher。
- Subscriber —— EventBus的register方法,会接收到一个Object对象。
- Event —— EventBus的post()方法中传入的事件类型 (可以是任意类型)。
- Publisher —— EventBus的post()方法。
ps:不好理解的可以看下述源码解析,源码不难,细心看完。
SpringEvent与EventBus的区别
主要区别
- 集成程度:Spring Event深度集成在Spring框架中,依赖于Spring的环境;而Guava EventBus是一个独立的库,不需要依赖Spring框架即可使用。
- 使用场景:Spring Event更适合于Spring应用内部的事件通知,可以很好地与Spring的其他特性如AOP、事务管理等结合使用;而Guava EventBus更适合于进程内的消息通讯,特别是在不需要Spring环境的情况下。
- 灵活性:Spring Event提供了更多的灵活性和配置选项,例如支持异步事件、多线程环境等;而Guava EventBus则更加轻量级和简单。
选型时就是因为SpringEvent强依赖Spring容器,而我们项目不使用Spring作为框架,所以使用EventBus。在使用过程中,我们需要手动注册Eventbus的事件,而SpringEvent可以自动管理。
观察者模式
SpringEvent和EventBus都是使用观察者模式 不管是SpringEvent还是EventBus都是对观察者模式的实现。与传统的观察者模式不同的是,它是观察者模式的非显示实现,说白了就是通过第三方将消息发布者与订阅者解耦。
传统的观察的模式需要在消息发布方维护一个订阅者的队列,耦合性是比较强的。而SpringEvent和EventBus是通过自身来管理发布者与订阅者的关系,发布者不再关心有多少订阅者,达到一个解耦的效果。
示例
java
代码解读
复制代码
import com.google.common.eventbus.EventBus; import com.google.common.eventbus.Subscribe; // 定义事件类 class SomeEvent { private String message; public SomeEvent(String message) { this.message = message; } public St