在Google Guava 10版本引入了EventBus, 它主要用来简化我们处理生产/消费者编程模型.
基本用法
使用Guava之后, 如果要订阅消息, 就不用再继承指定的接口, 只需要在指定的方法上加上@Subscribe注解即可:
- public class EventListener {
- public int lastMessage = 0;
- @Subscribe
- public void listen(OurTestEvent event) {
- lastMessage = event.getMessage();
- }
- public int getLastMessage() {
- return lastMessage;
- }
- }
上面的lastMessage用来接收消息.
下面定义的类用来对消息进行封装:
- public class OurTestEvent {
- private final int message;
- public OurTestEvent(int message) {
- this.message = message;
- }
- public int getMessage() {
- return message;
- }
- }
通过写一个测试来了解EventBus如何工作:
- @Test
- public void shouldReceiveEvent() throws Exception {
- // given
- EventBus eventBus = new EventBus("test");
- EventListener listener = new EventListener();
- eventBus.register(listener);
- // when
- eventBus.post(new OurTestEvent(200));
- // then
- assertThat(listener.getLastMessage()).isEqualTo(200);
- }
上面的测试是不是很简单?
MultiListener的使用
只需要在要订阅消息的方法上加上@Subscribe注解即可实现对多个消息的订阅:
- public class MultipleListener {
- public Integer lastInteger;
- public Long lastLong;
- @Subscribe
- public void listenInteger(Integer event) {
- lastInteger = event;
- }
- @Subscribe
- public void listenLong(Long event) {
- lastLong = event;
- }
- public Integer getLastInteger() {
- return lastInteger;
- }
- public Long getLastLong() {
- return lastLong;
- }
- }
下面是对应的测试:
- @Test
- public void shouldReceiveMultipleEvents() throws Exception {
- // given
- EventBus eventBus = new EventBus("test");
- MultipleListener multiListener = new MultipleListener();
- eventBus.register(multiListener);
- // when
- eventBus.post(new Integer(100));
- eventBus.post(new Long(800));
- // then
- assertThat(multiListener.getLastInteger()).isEqualTo(100);
- assertThat(multiListener.getLastLong()).isEqualTo(800L);
- }
高级用法
1.Dead Event
如果EventBus发送的消息都不是订阅者关心的称之为Dead Event. 看下面的例子:
- /**
- * Listener waiting for the event that any message was posted but not delivered to anyone
- */
- public class DeadEventListener {
- boolean notDelivered = false;
- @Subscribe
- public void listen(DeadEvent event) {
- notDelivered = true;
- }
- public boolean isNotDelivered() {
- return notDelivered;
- }
- }
下面是测试类:
- @Test
- public void shouldDetectEventWithoutListeners() throws Exception {
- // given
- EventBus eventBus = new EventBus("test");
- DeadEventListener deadEventListener = new DeadEventListener();
- eventBus.register(deadEventListener);
- // when
- eventBus.post(new OurTestEvent(200));
- assertThat(deadEventListener.isNotDelivered()).isTrue();
- }
如果没有消息订阅者监听消息, EventBus将发送DeadEvent消息, 这时我们可以通过log的方式来记录这种状态.
2.Event的继承
如果Listener A监听Event A, 而Event A有一个子类Event B, 此时Listener A将同时接收Event A和B消息
看下面的例子:
- public class NumberListener {
- private Number lastMessage;
- @Subscribe
- public void listen(Number integer) {
- lastMessage = integer;
- }
- public Number getLastMessage() {
- return lastMessage;
- }
- }
- public class IntegerListener {
- private Integer lastMessage;
- @Subscribe
- public void listen(Integer integer) {
- lastMessage = integer;
- }
- public Integer getLastMessage() {
- return lastMessage;
- }
- }
对应的测试类:
- @Test
- public void shouldGetEventsFromSubclass() throws Exception {
- // given
- EventBus eventBus = new EventBus("test");
- IntegerListener integerListener = new IntegerListener();
- NumberListener numberListener = new NumberListener();
- eventBus.register(integerListener);
- eventBus.register(numberListener);
- // when
- eventBus.post(new Integer(100));
- // then
- assertThat(integerListener.getLastMessage()).isEqualTo(100);
- assertThat(numberListener.getLastMessage()).isEqualTo(100);
- //when
- eventBus.post(new Long(200L));
- // then
- // this one should has the old value as it listens only for Integers
- assertThat(integerListener.getLastMessage()).isEqualTo(100);
- assertThat(numberListener.getLastMessage()).isEqualTo(200L);
- }
相关推荐
EventBus是google的一个Java工具包其中的一个工具类,类似的有多个版本其中包括移植到Android端的 和改良的,功能基本都是一样的。此处主要是对Guava版的EventBus分析,关于。 ###2. 功能简介 ####2.1 EventBus介绍 ...
├─Google Guava 第19讲-Guava之EventBus和NIO2.0 WatchService综合实战.wmv ├─Google Guava 第20讲-实战:手动实现一个EventBus-01快速搭建程序结构.wmv ├─Google Guava 第21讲-实战:手动实现一个EventBus-...
EventBus 是 Guava 中的一个轻量级事件总线,用于组件间的解耦通信。订阅者可以注册对特定事件的兴趣,当事件发生时,会被通知。 通过学习 Google Guava 官方教程,开发者能够更有效地利用这些工具,提高代码质量...
EventBus是Google Guava项目的一部分,提供了一个轻量级的事件机制实现。它基于观察者模式(或发布订阅模式),主要分为三部分:发布者、监听者、事件。EventBus的使用非常简单,只需要定义事件对象、事件监听器和...
《深入理解Google Guava:函数式接口与EventBus解析》 Google Guava是Google推出的一个开源库,它为Java开发人员提供了一套丰富的工具类和集合框架,极大地提高了开发效率和代码质量。本资料主要围绕Guava中的两个...
Guava还包含了一些其他实用功能,如事件总线(EventBus)用于解耦组件间的通信,RangeSet用于处理有序值的集合,Optional类用于表示可能为空的值,避免空指针异常。 总的来说,Google Guava库是一个功能强大的Java...
《谷歌Guava库详解》 谷歌Guava,全称为Google Guava,是Google推出的一款Java库,它包含一系列基础工具类,旨在简化Java开发工作,提高代码效率和可维护性。Guava的核心特性包括集合框架、缓存、原始类型支持、...
Guava是Google开发的一个核心库,它为Java平台提供了许多实用工具类,涵盖了集合、并发、I/O、字符串处理、数学运算等多个方面。这个压缩包包含的是Guava库的18.0版本,分为两个部分:`guava-18.0.jar`和`guava-18.0...
以上只是 Guava 30.1.1 版本中的一部分核心功能,实际使用中还有许多其他实用工具类,如 `Range`, `EventBus`, `RateLimiter` 等。Guava 的设计目标是提高代码质量和效率,通过提供这些工具类,开发者可以更加专注于...
9. **事件监听**:Guava的`EventBus`是一个简单的发布-订阅事件总线,用于组件间的通信,使得松耦合的组件能有效地传递信息。 10. **服务加载器**:Guava的`ServiceLoader`可以方便地加载实现特定接口的类,特别是...
Guava是Google公司开发的一款适用于Java的工具类集合。
Guava 是一个由 Google 开发并维护的 Java 库,它提供了许多实用工具类和集合框架的增强功能,极大地丰富了 Java 平台的标准库。Guava 的目标是解决 Java 开发人员在日常工作中遇到的各种常见问题,提高开发效率和...
EventBus是Google Guava库的一部分,它提供了一种发布/订阅模式的事件传递机制,允许应用程序的不同组件之间进行异步通信,而无需直接引用彼此。 **二、EventBus的使用** 1. **依赖添加**:首先,在SpringBoot项目...
Guava是Google开发的一个Java库,它包含许多Google核心库中的高级集合、缓存、原生类型支持、并发包、字符串处理、I/O等工具类。版本33.0.0是Guava的一个更新,提供了最新的功能改进和错误修复。在深入探讨Guava常用...
Guava是Google为Java平台设计并维护的一个开源库,它提供了许多高级功能和实用工具,极大地增强了Java开发的效率和代码质量。Guava 26.0-jre版本是针对Java运行时环境(JRE)优化的一个特定版本,旨在更好地支持Java...
谷歌Guava库是Java开发人员广泛使用的开源工具集,它提供了许多高级数据结构、集合类、缓存机制、并发工具、I/O工具以及字符串处理功能等。Guava 23.5是该库的一个特定版本,它包含了从早期版本到23.5之间的一系列...
8. **事件监听**:Guava的EventBus是一种发布-订阅事件总线,用于组件之间的松耦合通信,可以替代传统的监听器模式。 9. ** Predicates和Conditions**:Guava提供了预定义和自定义的谓词(Predicate)和条件...
它比 Google Guava的EventBus更快、更强大 {citation needed}。 什么是 ASM ASM是一个java库,提供实时的字节码修改和生成。 它的名字被称为内联汇编器, 虽然我认为是沙明丸绫的迷你裙…… AsmEventBus由ASM供电...
8. **事件监听**:Guava的 EventBus 使得事件驱动编程在Java 5环境下变得可能,它允许组件之间松散耦合,通过发布和订阅事件来进行通信。 9. **运行时类型信息**:Guava提供了TypeToken和Types等工具类,帮助开发者...
Guava是Google开发的一个核心库,它为Java平台提供了许多实用工具类,极大地丰富了Java标准库的功能。这个"guava-18.0资料"包含的资源是Guava库的18.0版本,该版本是Guava的一个稳定版本,提供了一系列改进和新特性...