Guava中的事件机制以及和Spring事件机制的对比

2021-09-18  本文已影响0人  文景大大

在以前的文章中,我们有介绍过Java原生的事件机制和Spring提供的事件机制使用方法:

《Spring事件机制》

今天来介绍下Guava中的事件机制。

一、Guava事件机制介绍

首先,我们新建一个事件中心,用来初始化事件源、注册监听者、注销监听者、发送事件消息。

public class MyEventBusCenter {

    private static EventBus eventBus = new EventBus("my");

    private MyEventBusCenter(){}

    public static EventBus getEventBus() {
        return eventBus;
    }

    public static void register(Object object){
        eventBus.register(object);
    }

    public static void unregister(Object object){
        eventBus.unregister(object);
    }

    public static void postMessage(Object object){
        eventBus.post(object);
    }

}

然后我们建立两个监听者,用来分别监听不同类型的事件消息:

@Slf4j
public class MyObserverA {

    /**
     * 标有@Subscribe注解的方法才会被认为是消息处理方法
     * @param message,只能接收类型为String的消息
     */
    @Subscribe
    public void dealMessage(String message){
        log.info("观察者A接收到的消息为:{}", message);
    }

}
@Slf4j
public class MyObserverB {

    /**
     * 标有@Subscribe注解的方法才会被认为是消息处理方法
     * @param message,只能接收类型为Integer的消息
     */
    @Subscribe
    public void dealMessage(Integer message){
        log.info("观察者B接收到的消息为:{}", message);
    }

}

最后,我们测试一下:

public class Test {

    public static void main(String[] args) {
        MyObserverA observerA = new MyObserverA();
        MyObserverB observerB = new MyObserverB();

        MyEventBusCenter.register(observerA);
        MyEventBusCenter.register(observerB);

        // MyEventBusCenter.unregister(observerB);
        MyEventBusCenter.postMessage("this is a string message");
        MyEventBusCenter.postMessage(999);
    }

}

运行之后,会发现,不同类型的事件消息被不同的监听者获取到了。

二、三种事件机制使用总结

Java原生 Spring事件机制 Guava事件机制
事件对象 EventObject ApplicationEvent Object
事件监听者 EventListener ApplicationListener @Subscribe方法
事件源头(发布者) 自己实现 ApplicationEventPublisher EventBus
优缺点 1.监听者需要自己手动注册;2.需要自己循环通知监听者; 1.监听者注册自动化;2.通知监听者自动化; 1.监听者需要自己手动注册;2.通知监听者自动化;

三、为什么要使用事件机制

本质上是设计模式中的观察者模式,是系统解耦的一大重要手段。区别于传统的顺序程序处理逻辑,事件机制最大的特点就是等待,即如果事件发生就进行处理,如果事件还没有发生,就等待。同样的功能,顺序程序处理的方法就是无限制的轮询,会空耗很多资源。

其次,一个事件消息可以被多个监听者消费,区别于接口调用,事件源头发布者无需知道哪个监听者需要消费该消息,消费成功还是失败,从而达到了解耦的目的。

上一篇 下一篇

猜你喜欢

热点阅读