我的编程空间,编程开发者的网络收藏夹
学习永远不晚

详解Guava中EventBus的使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

详解Guava中EventBus的使用

Guava EventBus

EventBus是Guava的事件处理机制,是设计模式中观察者模式(生产/消费者编程模型)的优雅实现。对于事件监听和发布订阅模式,EventBus使用非常简单便捷。

如果你做过CS的开发,下面这段代码可能会比较熟悉。

Button button = new Button("确定");

button.addListener( new Listener(){
    ...
    public void onClick(Event event){
        // 
    }
    ...
} );

为按钮注册事件监听,当按钮被点击时,则触发监听中相应的回调。在上面的代码中,有三个角色事件(Event),事件源(Button),监听(Listener),按钮作为事件源,当点击行为触发时,会将该行为封装成对应的点击事件,并根据行为类型将事件传递到响应的监听器上, 这也就是我们常说的监听器模式。

使用场景

实现消息生产者与消费者间的解耦,对应事件源与监听器,而消息则是事件

通过事件驱动业务流程扭转,通过异步执行机制实现代码非阻塞执行

扩展主线外的分支业务,减少代码的侵入,比如各个环节的消息通知、短信提醒等

实现消息广播到不同的模块中

示例

订单支付时的消息发送

// 商品
public class ProductOrder {
    private String user; // 用户
    private String product; // 商品
    private double amount; // 金额
    @Override
    public String toString() {
        return String.format("用户:%s购买了商品:%s,总金额:%s", user, product, amount);
    }
}
// 事件
    @Data
    @AllArgsConstructor
    public static class CreateOrderEvent implements OrderEvent{
        private ProductOrder order;
    }
// 监听
    public static class CreateOrderListener{
        @Subscribe
        public void onEvent(CreateOrderEvent event) {
            log.info("创建订单:{}", event.getOrder());
        }
    }

测试: 我们可以定义各种事件,比如订单创建、订单取消、订单支付... 只需要简单的三个步骤即可:

// 1. 创建事件总线
    EventBus eventBus = new EventBus( ProductOrder.class.getName() );
// 2. 注册事件监听
    eventBus.register( new CreateOrderListener() );
    eventBus.register( new PayOrderListener() );
    eventBus.register( new CancelOrderListener() );
    eventBus.register( new RenewOrderListener() );
// 3. 发送事件通知
    eventBus.post(new ProductOrder.CreateOrderEvent(order));
    TimeUnit.SECONDS.sleep(1);
    eventBus.post(new ProductOrder.CancelOrderEvent(order));
    TimeUnit.SECONDS.sleep(1);
    eventBus.post(new ProductOrder.RenewOrderEvent(order));
    TimeUnit.SECONDS.sleep(1);
    eventBus.post(new ProductOrder.PayOrderEvent(order));
    TimeUnit.SECONDS.sleep(5);
    eventBus.post(new ProductOrder.ReturnOrderEvent(order));

同时我们可以通过AsyncEventBus建立事件异步总线,这样在事件被触发时,可以异步通知监听者完成事件回调,以此来提高响应速度。

核心

EventBus

事件总线,可以理解为事件与监听器的上下文,主要实现事件的注册、事件的分发、以及监听器的回调,主要提供的方法包括:

  • register 注册监听,将监听器注册到事件总线,通过注解@Subscribe通知其监听的事件类型(第一个方法参数类型)
  • unregister 卸载监听,从事件总线移除监听
  • post 发送事件通知,根据post事件类型,找到所有订阅了该类型事件的监听器,并将事件推送到监听器对应的监听方法

Subscribe

通过@Subscribe标识监听器所关注的事件类型

Event

可以是任何对象,当然不建议将基础类型或String作为事件类型,这样就没法做到按类型区分了

通过上面的图就可以很清楚各个各个组件的职责,以及如何通过事件总线完成事件向监听的传播,最终基于事件回调机制完成消息传递。基于事件驱动的服务模型

上面这种结构的图形是不是在很多位置都见过,这是一种经典的设计模式。试想一下,我们不通过事件驱动行为时,一般你们怎么写代码,通过ifelse?或者其他有着异曲同工的 实现方法,目的最后都是一样。基于Guava提供的工具,我们不仅在使用时只需要简单的三个步骤就能实现,同样,当需要屏蔽该功能时只需要去掉register一行即可,对整体功能 也没有任何的影响。

在我们引入某种设计模式,某种架构模型时,总的目的都是为了降低代码模块间的耦合度,提升代码整体的可读性,最终让代码能够易于维护性,或者有一定的复用性。

总结

事件监听模式、观察者模式、发布订阅模式,都是非常的相似,通过建立事件与监听器、观察者与被观察者、生产者与消费者者间消息传递媒介(示例中的事件总线EventBus),

不仅能够使消息的发起者与接收者之间进行解耦,最主要的是通过消息传递渠道实现消息异步传播,提升系统效率

到此这篇关于详解Guava中EventBus的使用的文章就介绍到这了,更多相关Guava EventBus内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

详解Guava中EventBus的使用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

详解Guava中EventBus的使用

EventBus是Guava的事件处理机制,是设计模式中观察者模式(生产/消费者编程模型)的优雅实现。本文就来和大家聊聊EventBus的使用,需要的可以参考一下
2022-12-23

Android 消息分发使用EventBus的实例详解

Android 消息分发使用EventBus的实例详解1. AndroidStudio使用dependencies { //最新版本 compile 'org.greenrobot:eventbus:3.0.0' //可以翻倍提高E
2023-05-30

关于Guava缓存详解及使用说明

这篇文章主要介绍了关于Guava缓存详解及使用说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-11-13

Vue中的eventBus怎么使用

本篇内容主要讲解“Vue中的eventBus怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue中的eventBus怎么使用”吧!1. 简介Vue 组件中常见的有:父子组件通信、兄弟组件
2023-06-29

Java两大工具库Commons和Guava使用示例详解

这篇文章主要为大家介绍了Java两大工具库Commons和Guava使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-02-07

Guava中ListenableFuture与RateLimiter如何使用

Guava中ListenableFuture与RateLimiter如何使用,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。概念ListenableFuture顾名思义就是可
2023-06-17

EventBus 3.0.0如何在Android 应用中使用

本篇文章给大家分享的是有关EventBus 3.0.0如何在Android 应用中使用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。EventBus框架EventBus是一个通
2023-05-31

Flutter事件监听与EventBus事件的应用详解

EventBus的核心是基于Streams。它允许侦听器订阅事件并允许发布者触发事件,使得不同组件的数据不需要一层层传递,可以直接通过EventBus实现跨组件通讯
2023-05-15

Java Guava的使用技巧有哪些

本文小编为大家详细介绍“Java Guava的使用技巧有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java Guava的使用技巧有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。Guava简介Guav
2023-07-05

vue中的总线机制(EventBus)解析

这篇文章主要介绍了vue中的总线机制(EventBus),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-11-13

Android 中 EventBus 的使用之多线程事件处理

在这一系列教程的最后一篇中,我想谈谈GR的EventBus,在处理多线程异步任务时是多么简单而有效。 AsyncTask, Loader和Executor…… 拜托!Android中有很多种执行异步操作的方法(指平行于UI线程的)。Asyn
2022-06-06

SAP UI5和Kyma中的EventBus如何理解

SAP UI5和Kyma中的EventBus如何理解,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。SAP UI5EventBus是一个小型的subscribe/publis
2023-06-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录