Google的EventBus
EventBus是由谷歌提供的一种发布订阅的库,它很好的实现了观察者模式,EventBus是Guava的事件处理机制(生产/消费者编程模型)的优雅实现。对于事件监听和发布订阅模式,EventBus是一个非常优雅和简单解决方案,我们不用创建复杂的类和接口层次结构。

  • Guava
    Guava是一种基于开源的Java库,其中包含谷歌正在由他们很多项目使用的很多核心库。这个库是为了方便编码,并减少编码错误。这个库提供用于集合,缓存,支持原语,并发性,常见注解,字符串处理,I/O和验证的实用方法。
    Guava的好处
    - 标准化 - Guava库是由谷歌托管。高效 - 可靠,快速和有效的扩展JAVA标准库优化
    - Guava库经过高度的优化。
    - 函数式编程 -增加JAVA功能和处理能力。实用程序 - 提供了经常需要在应用程序开发的许多实用程序类。验证 -提供标准的故障安全验证机制。最佳实践 - 强调最佳的做法。
  • EventBus使用
    建议在使用EventBus之前去了解一下设计模式中的观察者模式,前面说过EventBus就是一种对观察者模式的优雅实现。
    首先需要引入Guava的jar,使用maven项目添加依赖:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>19.0</version>//版本
</dependency>

然后,我们设计发布者,EventBus类就是发布者,我们简单封装一下:

package event_bus;

import com.google.common.eventbus.EventBus;

/**
* Description:EventBus的封装
*
* @Author lht
* @Date 2018/12/15 下午9:12
**/
public class EventPost {
private static EventBus eventBus=new EventBus();


public static EventBus getEventBus(){
return eventBus;
}

public static void registerObserver(Object o){
eventBus.register(o);
}
public static void unregisterObserver(Object o){
eventBus.unregister(o);
}
public static void postMessage(Object o){
eventBus.post(o);
}

}

其中主要有注册register,取消注册unregister,发送post等几个方法。
下面就是订阅者:

package event_bus;

import com.google.common.eventbus.Subscribe;
import lombok.Data;

/**
* Description:订阅者
*
* @Author lht
* @Date 2018/12/15 下午9:19
**/
@Data
public class SubObserver {
private String name;

public SubObserver(String name){
this.name=name;
}

@Subscribe
public void getMessage(Object o){
if (o!=null){
System.out.println(name+"获取到消息:"+o.toString());
}
}

}

订阅者中如何通过发布 者得到订阅消息的呢?
在getMessage方法上有一个注解@Subscribe这个注解的意思就是订阅,所有的订阅者,只有在方法上添加这个注解,才会收到发布者发布的消息。下面通过使用来看一下:

package event_bus;

import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;

/**
* Description:
*
* @Author lht
* @Date 2018/12/15 下午9:21
**/
public class Main {
public static void main(String[] args) {
//两个观察者
SubObserver observer=new SubObserver("张三");
SubObserver observer1=new SubObserver("李四");
SubObserver observer2=new SubObserver("小明");

//注册进EventBus的容器中
EventPost.registerObserver(observer);
EventPost.registerObserver(observer1);
EventPost.registerObserver(observer2);

System.out.println("开始发送......");
EventPost.postMessage("今天心情怎么样?");

System.out.println(observer.getName()+"取消了注册!");

System.out.println("开始发送......");
EventPost.unregisterObserver(observer);
EventPost.postMessage("我今天心情不错?");
}
}

运行结果:

开始发送......
张三获取到消息:今天心情怎么样?
李四获取到消息:今天心情怎么样?
小明获取到消息:今天心情怎么样?
张三取消了注册!
开始发送......
李四获取到消息:我今天心情不错?
小明获取到消息:我今天心情不错?

总结:以上就是关于EventBus的简单使用,简单的事件模型机制还是很好用的。
在著名的Flume日志收集组件的源码中就使用了这个。