Guava之EventBus

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_26641781/article/details/83576815

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

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

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

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

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

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

public static void main(String[] args) {
        /*
        * 通过EventBus.register(Object object)方法来注册订阅者(subscriber),
        * 使用EventBus.post(Object event)方法来发布事件。
        * */
        //1.Creates a new EventBus with the given identifier.
        EventBus eventBus = new EventBus("jackson");
        
        //2.register all subscriber
        eventBus.register(new OrderEventListener());
   
        //publish event
        eventBus.post(new OrderEvent("hello"));
       
    }

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

public class OrderEventListener {

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

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

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

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

public static void main(String[] args) {
        /*
        * 通过EventBus.register(Object object)方法来注册订阅者(subscriber),
        * 使用EventBus.post(Object event)方法来发布事件。
        * */

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

        //2.register all subscriber
        eventBus.register(new OrderEventListener());
        eventBus.register(new HelloListener());

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

        eventBus.post("haha");
    }

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

猜你喜欢

转载自blog.csdn.net/qq_26641781/article/details/83576815