Guava教程-EventBus

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

事件

Guava 发布-订阅模式 中传递的事件,是一个普通的POJO类。


class OrderEvent {
    private String message;
    public OrderEvent(String message) {        
        this.message = message;
    }
    public String getMessage() {
        return message;
    }
}

订阅

使用Guava之后发布-订阅模式就变得很简单了,如果你需要订阅某种类型的消息,只需要在指定的方法上加上@Subscribe注解即可。代码如下:

class HelloEventListener{

    @Subscribe
    public void listen(OrderEvent event) {
        System.out.println("receive msg:"+event.getMessage());
    }
}

订阅方法名 没有强制要求,本例使用的listen,你可以使用任何方法名。

注册&发布

通过EventBus.register(Object object)方法来注册订阅者(subscriber ),使用EventBus.post(Object event)方法来发布事件。
代码如下:

//Creates a new EventBus with the given identifier.
        EventBus eventBus = new EventBus("ricky");

        //register all subscriber 
        eventBus.register(new HelloEventListener());

        //publish event 
        eventBus.post(new OrderEvent("hello"));
        eventBus.post(new OrderEvent("world"));

提升篇

1.一个subscriber也可以同时订阅多个事件,Guava会通过事件类型来和订阅方法的形参来决定到底调用subscriber的哪个订阅方法,如下:

class MultiEventListener {

    @Subscribe
    public void listen(OrderEvent event) {
        System.out.println("receive msg:"+event.getMessage());
    }

    @Subscribe
    public void listen(String event) {
        System.out.println("receive msg:"+event);
    }
}

EventBus post OrderEvent类型事件时,MultiEventListener 的listen(OrderEvent event)方法会被调用,当post String类型事件时,MultiEventListener 的listen(String event) 会被调用。

2.如果多个subscriber订阅了同一个事件,那么每个subscriber都将收到事件通知,并且收到事件通知的顺序跟注册的顺序保持一致,代码如下:

//Creates a new EventBus with the given identifier.
        EventBus eventBus = new EventBus("ricky");

        //register all subscriber 
        eventBus.register(new HelloEventListener());
        eventBus.register(new MultiEventListener());

        //publish event 
        eventBus.post(new OrderEvent("hello"));
        eventBus.post(new OrderEvent("world"));

        eventBus.post("Haha");

HelloEventListener和MultiEventListener都订阅了OrderEvent 事件,所以他们都会收到OrderEvent 事件通知。但是HelloEventListener会第一个收到OrderEvent 事件通知,其次是HelloEventListener。

你可能感兴趣的:(guava,EventBus)