Guava EventBus 使用
Guava EventBus 使用
EventBus 是 Google Guava 提供的消息发布-订阅类库,是设计模式中的观察者模式(生产/消费者编程模型)的优雅实现,消息通知负责人通过 EventBus 去注册/注销观察者,最后由消息通知负责人给观察者发布消息。
对于事件监听和发布订阅模式,EventBus 是一个非常优雅和简单解决方案,我们不用创建复杂的类和接口层次结构。
基本用法
创建事件监听器-Listener
我们只需要在指定的方法上加上 @Subscribe
注解就可以使其变成一个 Listener,这样便能订阅消息了。
/*** SimpleListener 监听器*/
public class SimpleListener {/*** 一个简单的 Listener 方法,监听 String 类型的消息*/@Subscribepublic void handle(String event){System.out.println("String message: " + event);}
}
创建 EventBus 推送消息
创建 EventBus 事件总线,注册事件监听器,并推送消息。
public class SimpleEventBusMain {public static void main(String[] args) {final EventBus eventBus = new EventBus();// 注册事件监听器eventBus.register(new SimpleListener());// 向订阅者发送消息eventBus.post("Hello EventBus");}
}
输出结果
String message: Hello EventBus
多事件类型的监听
只需要在要订阅消息的方法上加上 @Subscribe
注解就可以实现对多个不同消息的监听。并且, EventBus 会根据方法参数类型的不同,分别向不同的订阅者 Subscribe 推送不同的消息。参数类型不同,订阅者就不同。
创建 EventBus
/*** JobEventBusCenter*/
public final class JobEventBusCenter {private static class JobEventBus {private static final EventBus EVENT_BUS = new EventBus();}public static void register(JobEventListener<?> listener) {JobEventBus.EVENT_BUS.register(listener);}public static void post(JobEvent<?> event) {JobEventBus.EVENT_BUS.post(event);}}
创建不同的消息事件
- 抽象 JobEvent 类
/*** JobEvent*/
public abstract class JobEvent<T> extends EventObject {public JobEvent(T source) {super(source);}@Overridepublic T getSource() {return (T) super.getSource();}
}
- JobEventString 类,String 类型的消息事件
/*** String 类型的消息对象*/
public class JobEventString extends JobEvent<String> {public JobEventString(String source) {super(source);}@Overridepublic String getSource() {return super.getSource();}
}
- JobEventInteger 类,Integer 类型的消息事件
/*** Integer 类型的消息对象*/
public class JobEventInteger extends JobEvent<Integer> {public JobEventInteger(Integer source) {super(source);}@Overridepublic Integer getSource() {return super.getSource();}
}
创建事件监听器
- JobEventListener 接口
/*** 事件监听器接口*/
public interface JobEventListener<T> {void handle(T event);
}
- JobEventStringListener 类,用于监听 String 类型的消息
/*** JobEventStringListener*/
public class JobEventStringListener implements JobEventListener<JobEventString> {@Override@Subscribepublic void handle(JobEventString event) {String source = event.getSource();System.out.println("String message: " + source);}
}
- JobEventIntegerListener 类,用于监听 Integer 类型的消息
/*** JobEventIntegerListener*/
public class JobEventIntegerListener implements JobEventListener<JobEventInteger> {@Override@Subscribepublic void handle(JobEventInteger event) {Integer source = event.getSource();System.out.println("Integer message: " + source);}
}
创建 EventBus
- JobEventBusCenter 类,封装 EventBus 的功能
/*** JobEventBusCenter*/
public final class JobEventBusCenter {private static class JobEventBus {private static final EventBus EVENT_BUS = new EventBus();}public static void register(JobEventListener<?> listener) {JobEventBus.EVENT_BUS.register(listener);}public static void post(JobEvent<?> event) {JobEventBus.EVENT_BUS.post(event);}}
- EventBusMain 类
/*** EventBusMain*/
public class EventBusMain {public static void main(String[] args) {JobEventIntegerListener integerListener = new JobEventIntegerListener();JobEventStringListener stringListener = new JobEventStringListener();// 注册事件监听器JobEventBusCenter.register(integerListener);JobEventBusCenter.register(stringListener);// 发送事件JobEventBusCenter.post(new JobEventString("hello eventBus"));JobEventBusCenter.post(new JobEventInteger(123));}
}
输出结果
String message: hello eventBus
Integer message: 123
继承关系的 Event
如果 Listener A 监听 Event A, 而 Event A 有一个子类 Event B, 此时 Listener A 将同时接收 Event A 和 B 消息。
- 具有继承关系的两个类
/*** Animal*/
public class Animal {private String name;public Animal(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}/*** Dog*/
public class Dog extends Animal {public Dog(String name) {super(name);}
}
- 监听器
/*** AnimalListener*/
public class AnimalListener {@Subscribepublic void handle(Animal animal) {System.out.println("Animal name: " + animal.getName());}@Subscribepublic void handle(Dog dog) {System.out.println("Dog name: " + dog.getName());}
}
- 创建 EventBus
public class EventBusMain {public static void main(String[] args) {final EventBus eventBus = new EventBus();// 注册事件监听器eventBus.register(new AnimalListener());// 向订阅者发送消息eventBus.post(new Dog("dingding"));}
}
Dog name: dingding
Animal name: dingding
注意
- 使用 EventBus 时,监听方法的参数有且只能有一个,必须是引用类型,不能是基本数据类型,如:int 要换成 Integer,long 要缓存 Long 等等;
- 由于 EventBus 是将消息队列放入到内存中的,由 Listener 消费这个消息队列,故系统重启之后,保存或者堆积在队列中的消息丢失。
参考
Guide to Guava’s EventBus:https://www.baeldung.com/guava-eventbus#overview
Guava EventBus 使用相关推荐
- Guava库学习:学习Guava EventBus(二)EventBus 事件订阅示例
2019独角兽企业重金招聘Python工程师标准>>> 原文地址:Guava库学习:学习Guava EventBus(二)EventBus 事件订阅示例 上一篇Guava库学习:学习 ...
- Google Guava EventBus用于事件编程
在任何软件应用程序中都是如此,有些对象需要共享信息才能完成工作. 在Java应用程序中,实现信息共享的一种方法是拥有事件侦听器,其唯一目的是在发生所需事件时采取某些措施. 在大多数情况下,此过程有效, ...
- Google Guava EventBus和Java 7 WatchService用于事件编程
这篇文章将介绍如何使用Guava EventBus将更改发布到Java 7 WatchService检测到的目录或子目录中. Guava EventBus是向应用程序添加发布/订阅通信的好方法. Ja ...
- java guava eventbus_JAVA | Guava EventBus 使用
JAVA | Guava EventBus 使用 系列文章目录 Table of Contents [TOC] 前言 EventBus 是 Guava 的事件处理机制,是观察者模式(生产/消费模型)的 ...
- Guava EventBus 和 AsynEventBus
2019独角兽企业重金招聘Python工程师标准>>> 一.适用场景 很多时候一个事件会触发很多其他的事件,比如说一个充值操作,可能会设计到一些其他的操作,比如充值完成会奖励一些抽奖 ...
- Guava事件处理组件Eventbus使用入门
1.说明 EventBus是Google Guava的事件处理机制, 是设计模式中观察者模式的优雅实现, 是一个进程内的生产者/消费者模型. 为了解耦事件的发布和订阅, 使用EventBus组件, 是 ...
- EventBus VS Spring Event
EventBus VS Spring Event 本地异步处理,采用事件机制 可以使 代码解耦,更易读.事件机制实现模式是 观察者模式(或发布订阅模式),主要分为三部分:发布者.监听者.事件. Gua ...
- Guava关于JAVA中系统组件之间交互通讯(非线程之间通讯)
2019独角兽企业重金招聘Python工程师标准>>> Guava EventBus组件 // Class is typically registered by the contai ...
- Guava、Spring 如何抽象观察者模式?
什么是观察者模式 观察者模式 是一种行为设计模式,允许定义一种订阅通知机制,可以在对象(被观察者)事件发生时通知多个 "观察" 该对象的观察者对象,所以也被称为 发布订阅模式 其实 ...
最新文章
- 如何判断两个单向链表是否有相交,并找出交点
- linux文件名通配符:* ? [:digit:]数字 [:lower:]小写字母 [:upper:]大写字母
- C++primer 10.2.1节练习
- 广州测试沙龙的问题。
- Linux系统维护人员的必备参考书
- docker给php装swoole,制作php+swoole的Docker环境
- Python实现向量自回归(VAR)模型——完整步骤
- 用python做股票因子分析_因子分析(by+alphalens)
- mysql升级 windows10_Windows10系统MySQL5.7升级到8.0
- [gdc13]古墓丽影DirectX11技术
- 台式机安装纯ubuntu系统的操作步骤
- 明明安装了模块/包,Python提示无包/模块/报错
- 一个大专生的java从业心路历程
- 2022网易云前端+nodejs后端API项目部署全解
- 【网络原理】一个数据包从发送到接收在网络中经历了那些过程(详细分析)
- Windows10环境下设置播放器默认软件打开方式
- 小程序实现活动倒计时功能
- 解决winscp中普通用户无法上传、删除、移动文件
- BWK210-180-05电压输出单轴倾角传感器的使用
- echarts name 坐标轴_从零打造Echarts —— v1 ZRender和MVC