guava中EventBus(事件总线)源码分析与使用

1.EventBus:事件发布-订阅消息总线,简化应用程序内各组件间、进行模块间通信、解耦。允许对象通过观察者模式相互通信。

2.EventBus实现框架:

                  greenrobot的EventBus  

                  guava中EventBus

3.EventBus的工作模式

    guava中EventBus(事件总线)源码分析与使用_第1张图片

Publisher(发布者)通过post()方法,把Event事件发布出去,Subscriber(订阅者)在onEvent()方法中接收事件。

发布者:负责发出事件,然后将这些事件传递到事件总线,并发送给订阅该事件的所有侦听器。

侦听器侦听器订阅事件,并在生产者发布该事件时触发该事件,侦听器方法同步或异步运行,具体取决于使用的事件总线的类型。为了使同步运行的监听方法,可以使用一个同步事件总线是默认EventBus类,异步运行,使用AsyncEventBus类,这是一个EventBus子类,它的构造需要一个executor将被用于在单独的线程上执行该方法。默认使用EventBus。
事件 在Guava事件总线中,事件只是使用类名唯一标识的对象

4.eventbus通信的优点:

  • 简化了组件间交流的方式
  • 对事件通信双方进行解耦
  • 速度快,性能好

5.guava eventbus使用

p1.创建事件类型

package com.eventbus;

/**
 * 创建事件类型:HelloEvent
 */
public class HelloEvent {
    private int eventNo;

    private String eventName;

    public HelloEvent(int eventNo, String eventName) {
        this.eventNo = eventNo;
        this.eventName = eventName;
    }


    public int getEventNo() {
        return eventNo;
    }

    public void setEventNo(int eventNo) {
        this.eventNo = eventNo;
    }

    public String getEventName() {
        return eventName;
    }

    public void setEventName(String eventName) {
        this.eventName = eventName;
    }

    @Override
    public String toString() {
        return "HelloEvent{" +
                "eventNo=" + eventNo +
                ", eventName='" + eventName + '\'' +
                '}';
    }
}

package com.eventbus;

/**
 * 创建新事件类型 WorldEvent
 */
public class WorldEvent {
    private int eventNo;

    private String eventName;

    public WorldEvent(int eventNo, String eventName) {
        this.eventNo = eventNo;
        this.eventName = eventName;
    }


    public int getEventNo() {
        return eventNo;
    }

    public void setEventNo(int eventNo) {
        this.eventNo = eventNo;
    }

    public String getEventName() {
        return eventName;
    }

    public void setEventName(String eventName) {
        this.eventName = eventName;
    }

    @Override
    public String toString() {
        return "HelloEvent{" +
                "eventNo=" + eventNo +
                ", eventName='" + eventName + '\'' +
                '}';
    }
}

p2 创建监听器,接收事件消息

package com.eventbus;

import com.google.common.eventbus.Subscribe;

/**
 * 创建事件监听器:GuavaEventListener
 */
public class GuavaEventListener {

    @Subscribe
    public void subscribeHelloEvent(HelloEvent event){
        System.out.println("接收到 helloEvent,name:"+event.getEventName());
        System.out.println("处理 helloEvent,eventNo:"+event.getEventNo());

    }
    @Subscribe
    public void processObject(Object object) {
        System.out.println("process common event, class:" + object.getClass().getSimpleName());
    }
}

package com.eventbus;

import com.google.common.eventbus.Subscribe;

/**
 * 事件隔离:
 * 1.通过创建新的EventListener
 * 2.创建新的EventBus
 * 通过以上可以隔离事件
 *
 */
public class GuavaEventListener2 {

    @Subscribe
    public void subscribeHelloEvent2(WorldEvent event){
        System.out.println("接收到 WorldEvent,name:"+event.getEventName());
        System.out.println("处理 WorldEvent,eventNo:"+event.getEventNo());

    }
    @Subscribe
    public void processObject(Object object) {
        System.out.println("process common event, class:" + object.getClass().getSimpleName());
    }
}

p3.测试eventbus收发事件消息
package com.eventbus;

import com.google.common.eventbus.EventBus;

public class EventBusTest {
    public static void main(String[] args) {
        //1.创建事件总线
        EventBus eventBus=new EventBus();
        //2.创建监听器
        GuavaEventListener listener=new GuavaEventListener();
        //3.事件总线注册监听器
        eventBus.register(listener);
         //4.发送事件消息
        eventBus.post(new HelloEvent(12,"hello"));
        //5.发送完消息,必须取消监听器
        eventBus.unregister(listener);

        //创建新的EventBus隔离事件
        EventBus eventBus2=new EventBus();
        GuavaEventListener2 listener2=new GuavaEventListener2();
        eventBus2.register(listener2);
        eventBus2.post(new WorldEvent(222,"world"));
        eventBus2.unregister(listener2);
    }
}

6.Guava中消息总线EventBus源码分析

guava中EventBus(事件总线)源码分析与使用_第2张图片

备注:Executor主要用于异步消息总线执行一个线程使用

guava中EventBus(事件总线)源码分析与使用_第3张图片

guava中EventBus(事件总线)源码分析与使用_第4张图片

EventBus 注册监听器源码分析:register()方法

guava中EventBus(事件总线)源码分析与使用_第5张图片

guava中EventBus(事件总线)源码分析与使用_第6张图片

EventBus发送事件消息源码分析:post()方法

guava中EventBus(事件总线)源码分析与使用_第7张图片

guava中EventBus(事件总线)源码分析与使用_第8张图片

guava中EventBus(事件总线)源码分析与使用_第9张图片

guava中EventBus(事件总线)源码分析与使用_第10张图片

异步消息总线(AsyncEventBus)

guava中EventBus(事件总线)源码分析与使用_第11张图片

你可能感兴趣的:(源码阅读,java,消息总线,eventbus,guava,后端)