Guava中的事件机制以及和Spring事件机制的对比
2021-09-18 本文已影响0人
文景大大
在以前的文章中,我们有介绍过Java原生的事件机制和Spring提供的事件机制使用方法:
今天来介绍下Guava中的事件机制。
一、Guava事件机制介绍
首先,我们新建一个事件中心,用来初始化事件源、注册监听者、注销监听者、发送事件消息。
public class MyEventBusCenter {
private static EventBus eventBus = new EventBus("my");
private MyEventBusCenter(){}
public static EventBus getEventBus() {
return eventBus;
}
public static void register(Object object){
eventBus.register(object);
}
public static void unregister(Object object){
eventBus.unregister(object);
}
public static void postMessage(Object object){
eventBus.post(object);
}
}
然后我们建立两个监听者,用来分别监听不同类型的事件消息:
@Slf4j
public class MyObserverA {
/**
* 标有@Subscribe注解的方法才会被认为是消息处理方法
* @param message,只能接收类型为String的消息
*/
@Subscribe
public void dealMessage(String message){
log.info("观察者A接收到的消息为:{}", message);
}
}
@Slf4j
public class MyObserverB {
/**
* 标有@Subscribe注解的方法才会被认为是消息处理方法
* @param message,只能接收类型为Integer的消息
*/
@Subscribe
public void dealMessage(Integer message){
log.info("观察者B接收到的消息为:{}", message);
}
}
最后,我们测试一下:
public class Test {
public static void main(String[] args) {
MyObserverA observerA = new MyObserverA();
MyObserverB observerB = new MyObserverB();
MyEventBusCenter.register(observerA);
MyEventBusCenter.register(observerB);
// MyEventBusCenter.unregister(observerB);
MyEventBusCenter.postMessage("this is a string message");
MyEventBusCenter.postMessage(999);
}
}
运行之后,会发现,不同类型的事件消息被不同的监听者获取到了。
二、三种事件机制使用总结
Java原生 | Spring事件机制 | Guava事件机制 | |
---|---|---|---|
事件对象 | EventObject | ApplicationEvent | Object |
事件监听者 | EventListener | ApplicationListener | @Subscribe方法 |
事件源头(发布者) | 自己实现 | ApplicationEventPublisher | EventBus |
优缺点 | 1.监听者需要自己手动注册;2.需要自己循环通知监听者; | 1.监听者注册自动化;2.通知监听者自动化; | 1.监听者需要自己手动注册;2.通知监听者自动化; |
三、为什么要使用事件机制
本质上是设计模式中的观察者模式,是系统解耦的一大重要手段。区别于传统的顺序程序处理逻辑,事件机制最大的特点就是等待,即如果事件发生就进行处理,如果事件还没有发生,就等待。同样的功能,顺序程序处理的方法就是无限制的轮询,会空耗很多资源。
其次,一个事件消息可以被多个监听者消费,区别于接口调用,事件源头发布者无需知道哪个监听者需要消费该消息,消费成功还是失败,从而达到了解耦的目的。