美文网首页
Guava中的事件机制以及和Spring事件机制的对比

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

作者: 文景大大 | 来源:发表于2021-09-18 16:12 被阅读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.通知监听者自动化;

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

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

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

相关文章

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

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

  • Spring之事件机制初始化流程

    描述 在Spring之事件机制模型中我们了解了spring事件机制的模型以及工作流程,下面通过源码分析spring...

  • Spring 事件机制概述

    Spring 事件机制是观察者模式的典型应用,本文将由浅入深从观察者模式、java事件机制、Spring事件机制三...

  • 第9章-Spring的事件机制

    Spring 容器提供了事件管理机制,Spring 容器内部很多节点都会发布事件,也支持自定义事件。 一、事件机制...

  • Guava EventBus实现原理

    开篇 EventBus是Guava的事件处理机制,是设计模式中的观察者模式的优雅实现。对于事件监听和发布订阅模式,...

  • Guava EventBus应用实例

    来个开头 EventBus是guava包中的一个事件通知组件,可以用来在同一个JVM中,实现事件通知机制。异步和同...

  • Spring中的事件机制

    Spring中通过事件与对应的监听器可以完成很多操作,比如关于context容器的的事件有如下4个: Contex...

  • Spring中的事件机制

    Spring中的事件机制 Spring中的事件机制是一个观察者模式的实现.观察者模式就是一个目标对象管理所有相依于...

  • Spring 事件监听机制及原理分析

    简介 在JAVA体系中,有支持实现事件监听机制,在Spring 中也专门提供了一套事件机制的接口,方便我们实现。比...

  • JavaScript 异步编程的几个方法

    原文地址基于浏览器事件轮回机制(以及nodejs中的事件轮询机制),JavaScript常常会运行在异步环境中。而...

网友评论

      本文标题:Guava中的事件机制以及和Spring事件机制的对比

      本文链接:https://www.haomeiwen.com/subject/iphygltx.html