版权声明:本文为博主原创文章,未经博主允许不得转载。 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。