Guava库学习:学习Guava EventBus(一)EventBus

Stella981
• 阅读 753

   在软件开发过程中,对象信息的分享以及相互直接的协作是必须的,困难在于确保对象之间的沟通是有效完成的,而不是拥有成本高度耦合的组件。当对象对其他组件的责任有太多的细节时,它被认为是高度耦合的。当一个应用程序有高度的耦合,维护将变得非常具有挑战,任何变化都将带来涟漪效应。为了解决这一类的软件设计问题,我们就需要基于事件的编程。本篇,我们就来学习Guava 基于事件的编程,Guava EventBus(一)EventBus。

    在基于事件的编程中,对象可以订阅/监听特定事件,或发布事件。在Java中,我们已经对事件的监听有了初步的认识,一个事件侦听器是一个对象,其目的是当特定事件发生时得到通知。Guava Cache系列中,我们已经提到了RemovalListener,本篇起,我们将要学习Guava EventBus类,以及它如何作用于发布和订阅的事件。EventBus类将能够提高相互的协作水平,而且几乎没有对象之间的耦合。值得注意的是,EventBus是一个轻量级、进程内发布/订阅的沟通风格,并不用于进程间通信。

    本系列的学习中,我们将学习和讨论以下内容:

  • EventBus 以及 AsyncEventBus类

  • 使用EventBus注册订阅事件和事件通知

  • 使用EventBus发布订阅

  • 根据我们的需要,编写事件处理程序,选择粗粒度或细粒度的事件处理机制

  • 结合EventBus,使用依赖注入框架

EventBus

    EventBus类位与com.google.common.eventbus包下,它是Guava基于事件编程,发布/订阅编程范式的重点和基础,在一个非常高的层面,用户将注册EventBus特定事件的通知,发布者将发送事件通过EventBus分发给感兴趣的用户。连续的通知所有用户,更重要的是在任何的代码中都可以很迅速的执行事件处理方法。

    创建 EventBus 实例

通过调用EventBus构造函数,我们就可以创建一个EventBus实例:

EventBus eventBus = new EventBus();

我们还可以提供一个可选的字符串参数作为标识符来创建一个EventBus(用于日志记录):

        EventBus eventBus1 = new EventBus(TradeAccountEvent.class.getName()) ;

    订阅事件

通过以下三个必须的步骤,可以从EventBus接收通知对象:

  1. 对象需要定义一个公共方法,只接受一个参数,这个参数标识事件类型的对象有兴趣接收通知。

  2. 事件通知暴露的方法必须使用@Subscribe注解。

  3. 最后,一个对象注册的EventBus实例,register注册方法,本身作为一个参数传递给EventBus。

    发布事件

想要发布事件,我们需要向EventBus.post方法传递一个event对象,EventBus将调用订阅者注册处理程序方法,分配带有事件对象类型的参数。这是非常强大的设计概念,包含了接口、超类、实现超类的接口等,这意味着我们可以很容易的,使我们的事件处理程序,变成我们想要的细粒度,只需要通过改变类型接受的事件处理方法。

    定义处理方法

用于事件处理程序的方法,必须只接受一个事件对象参数,如前所述,EventBus将连续调用事件处理方法,所以保证这些方法快速完成显得尤为重要。如果需要做任何扩展处理的接收事件,最好是在一个单独的线程运行该代码。

    并发性

EventBus不会从多个线程调用处理程序方法,除非使用@AllowConcurrentEvent注释处理程序方法。通过@AllowConcurrentEvent注解注释处理方法,我们断言处理程序方法是线程安全的。使用@AllowConcurrentEvent注释的处理程序方法,本身不会在EventBus中注册。

至此,我们已经简单的学习了如何使用EventBus类,下一篇起,我们让通过一些示例进行学习,欢迎持续关注。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
java中比较两个时间的差值
项目背景1.某篇文稿的发布时间是publishDate,例如:2020072118:00:41。2.现要求判断该篇文稿的发布时间是否在近30天之内。publicstaticlongdayDiff(DatecurrentDate,DatepublishDate){LongcurrentTimecurrentDat
Stella981 Stella981
3年前
Guava库学习:学习Guava EventBus(二)EventBus 事件订阅示例
    原文地址:Guava库学习:学习GuavaEventBus(二)EventBus事件订阅示例(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fwww.xx566.com%2Fdetail%2F215.html)上一篇Guava库学习:学习GuavaEventBus(一
Stella981 Stella981
3年前
Guava — EventBus
Guava提供了事件总线的一个实现方案EventBus。它是事件发布订阅模式的实现,观察者模式。Guava为我们提供了同步实现EventBus和异步实现AsyncEventBus两个事件总线,他们都不是单例的eventBus.post(1);eventBus.post(1L);post方法,直接发布事件订阅者需要注册进来,ev
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
unity将 -u4E00 这种 编码 转汉字 方法
 unity中直接使用 JsonMapper.ToJson(对象),取到的字符串,里面汉字可能是\\u4E00类似这种其实也不用转,服务器会通过类似fastjson发序列化的方式,将json转对象,获取对象的值就是中文但是有时服务器要求将传参中字符串中类似\\u4E00这种转汉字,就需要下面 publ
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这