Guava - EventBus(事件总线)

简介:

Guava在guava-libraries中为我们提供了事件总线EventBus库,它是事件发布订阅模式的实现,让我们能在领域驱动设计(DDD)中以事件的弱引用本质对我们的模块和领域边界很好的解耦设计。

不再多的废话,直奔Guava EventBus主题。首先Guava为我们提供了同步事件EventBus和异步实现AsyncEventBus两个事件总线,他们都不是单例的,官方理由是并不想我们我们的使用方式。当然如果我们想其为单例,我们可以很容易封装它,一个单例模式保证只创建一个实例就对了。

下面将以EventBus为例,AsyncEventBus使用方式与其一致的。

订阅

首先EventBus为我们提供了register方法来订阅事件,Guava在这里的实现很友好,我们不需要实现任何的额外接口或者base类,只需要在订阅方法上标注上@Subscribe和保证只有一个输入参数的方法就可以搞定。这样对于简单的某些事件,我们甚至可以直接

new Object() {

    @Subscribe
    public void lister(Integer integer) {
        System.out.printf("%d from int%n", integer);
    }
}

Guava发布的事件默认不会处理线程安全的,但我们可以标注@AllowConcurrentEvents来保证其线程安全

发布

对于事件源,则可以通过post方法发布事件。 正在这里对于Guava对于事件的发布,是依据上例中订阅方法的方法参数类型决定的,换而言之就是post传入的类型和其基类类型可以收到此事件。例如下例:

final EventBus eventBus = new EventBus();
eventBus.register(new Object() {

    @Subscribe
    public void lister(Integer integer) {
        System.out.printf("%s from int%n", integer);
    }

    @Subscribe
    public void lister(Number integer) {
        System.out.printf("%s from Number%n", integer);
    }

    @Subscribe
    public void lister(Long integer) {
        System.out.printf("%s from long%n", integer);
    }
});

eventBus.post(1);
eventBus.post(1L);

在这里有 Integer,Long,与它们基类Number。我们发送一个整数数据的时候,或者Integer和Number的方法接收,而Long类型则Long类型和Number类型接受。

所以博主建议对于每类事件封装一个特定的事件类型是必要的。

DeadEvent

DeadEvent暂时不清楚怎么翻译更合意,它描述的是死亡事件,即没有没任何订阅者关心,没有被处理,以DeadEvent类型参数的方法表示.例如在上例中我们post一个Object类型,如下:

final EventBus eventBus = new EventBus();
eventBus.register(new Object() {

    @Subscribe
    public void lister(DeadEvent event) {
        System.out.printf("%s=%s from dead events%n", event.getSource().getClass(), event.getEvent());
    }
});

eventBus.post(new Object());

更多Guava博文:

  1. Guava – 并行编程Futures
  2. Guava – EventBus(事件总线)


作者:破  狼 
出处:http://www.cnblogs.com/whitewolf/ 
本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。该文章也同时发布在我的独立博客中-个人独立博客博客园--破狼51CTO--破狼。http://www.cnblogs.com/whitewolf/p/4132840.html


相关文章
|
JavaScript
Vue(五)——全局事件总线, 消息订阅与发布 ,nextTick
使用事件总线: 接收数据:A组件想接收数据,则在A组件中给$bus绑定自定义事件,事件的回调留在A组件自身。
157 0
Vue(五)——全局事件总线, 消息订阅与发布 ,nextTick
|
JavaScript
Vue中 事件总线(eventBus)详解及使用
Vue中 事件总线(eventBus)详解及使用
265 0
Vue中 事件总线(eventBus)详解及使用
|
JavaScript
自定义事件总线
JS查漏补缺系列是我在学习JS高级语法时做的笔记,通过实践费曼学习法进一步加深自己对其的理解,也希望别人能通过我的笔记能学习到相关的知识点。这一次我们来试着自定义事件总线
73 0
|
JavaScript
vue全局事件总线和消息订阅详细讲解
vue全局事件总线和消息订阅详细讲解
vue全局事件总线和消息订阅详细讲解
|
开发者 容器
浅入ABP系列(4):事件总线
浅入ABP系列(4):事件总线
254 0
EventBus实现组件间异步
最近新换了工作,刚来比较轻松,所以想自己写几个小工具提升下自己的效率。在开发过程中发现组件的一些通讯问题,如果采用异步的方式,效率能得到很大提升,所以决定使用到EventBus(消息总线)技术,达到异步事件处理的目的。
|
Android开发
【EventBus】EventBus 事件总线框架简介 ( EventBus 使用流程 )
【EventBus】EventBus 事件总线框架简介 ( EventBus 使用流程 )
251 0
|
消息中间件 Android开发
【EventBus】发布-订阅模式 ( EventBus 组成模块 | 观察者模式 )
【EventBus】发布-订阅模式 ( EventBus 组成模块 | 观察者模式 )
306 0
【EventBus】发布-订阅模式 ( EventBus 组成模块 | 观察者模式 )
|
缓存
【EventBus】EventBus 源码解析 ( 注册订阅者总结 | EventBus 注册订阅者流程梳理 )
【EventBus】EventBus 源码解析 ( 注册订阅者总结 | EventBus 注册订阅者流程梳理 )
111 0
【EventBus】EventBus 源码解析 ( 注册订阅者总结 | EventBus 注册订阅者流程梳理 )
【EventBus】EventBus 源码解析 ( 取消订阅 )
【EventBus】EventBus 源码解析 ( 取消订阅 )
134 0