Guava之EventBus
阿新 • • 發佈:2018-11-01
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。