1. 程式人生 > >Guava之EventBus

Guava之EventBus

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。