Guava - EventBus(事件总线)

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

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

下面将以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传入的类型和其基类类型能够收到此事件。例以下例: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类型接受。google

因此博主建议对于每类事件封装一个特定的事件类型是必要的。线程

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(事件总线)
相关文章
相关标签/搜索