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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Radom7

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值