EventBus 是 Guava 的事件处理机制,是观察者模式(生产/消费模型)的一种实现。根据发送对象的类型,查找所有匹配的订阅处理器进行处理。
1. 默认当前线程直接调用
1.1.简单使用示例
package org.example.model.guava;import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;
import lombok.AllArgsConstructor;
import lombok.Data;
import org.junit.Test;public class EventBusTest {@AllArgsConstructor@Datapublic static class Person {private String name;private int age;}public static class SimpleListener {@Subscribe// Subscribe注解标注的方法为订阅处理器,处理String类型的事件public void doSomething(String event) {System.out.println(this.getClass().getSimpleName() + ":" + event);}@Subscribepublic void doSomething2(String event) {System.out.println(this.getClass().getSimpleName() + "2:" + event);}@Subscribe// 订阅处理Person类型的事件public void personListener(Person person) {System.out.println(this.getClass().getSimpleName() + ":" + person);}}@Testpublic void test() {EventBus eventBus = new EventBus();// 注解监听者eventBus.register(new SimpleListener());// 发送事件eventBus.post("发送字符串!");eventBus.post(new Person("张三", 20));}
}
执行结果:
SimpleListener2:发送字符串!
SimpleListener:发送字符串!
SimpleListener:EventBusTest.Person(name=张三, age=20)
1.2 监听器有继承关系时
监听器有继承关系时,父类和子类所有被Subscribe注解标记的方法都会被注册为事件订阅处理器。
package org.example.model.guava;import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;
import lombok.AllArgsConstructor;
import lombok.Data;
import org.junit.Test;public class EventBusTest {@AllArgsConstructor@Datapublic static class Person {private String name;private int age;}public static abstract class absListener {@Subscribepublic void doSomething2(String event) {System.out.println(this.getClass().getSimpleName() + "2:" + event);}@Subscribepublic void personListener(Person person) {System.out.println(this.getClass().getSimpleName() + ":" + person);}}public static class SimpleListener extends absListener {@Subscribepublic void doSomething(String event) {System.out.println(this.getClass().getSimpleName() + ":" + event);}}@Testpublic void test() {EventBus eventBus = new EventBus();eventBus.register(new SimpleListener());eventBus.post("发送字符串!");eventBus.post(new Person("张三", 20));}
}
执行结果:
SimpleListener:发送字符串!
SimpleListener2:发送字符串!
SimpleListener:EventBusTest.Person(name=张三, age=20)
1.3 事件对象有继承关系时
事件对象有继承关系时,由于子类型可以转换为父类型,订阅父类型的处理器可以订阅到子类型进行处理:
package org.example.model.guava;import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.experimental.SuperBuilder;
import org.junit.Test;public class EventBusTest {@AllArgsConstructor@SuperBuilder@Datapublic static class Person {private String name;private int age;}@SuperBuilder()public static class Man extends Person {}public static class SimpleListener {@Subscribepublic void personListener(Person person) {System.out.println(this.getClass().getSimpleName() + "---Person:" + person);}@Subscribepublic void manListener(Man man) {System.out.println(this.getClass().getSimpleName() + "---Man:" + man);}}@Testpublic void test() {EventBus eventBus = new EventBus();eventBus.register(new SimpleListener());eventBus.post(Man.builder().name("张三").age(20).build());}
}
执行结果:
SimpleListener---Man:EventBusTest.Person(name=张三, age=20)
SimpleListener---Person:EventBusTest.Person(name=张三, age=20)
1.4 订阅处理器执行异常不会影响其他订阅处理器执行
package org.example.model.guava;import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;
import org.junit.Test;public class EventBusTest {public static class SimpleListener {@Subscribepublic void listener1(String event) {System.out.println(this.getClass().getSimpleName() + "---1111:" + event);throw new RuntimeException();}@Subscribepublic void listener2(String event) {System.out.println(this.getClass().getSimpleName() + "---2222:" + event);}}@Testpublic void test() {EventBus eventBus = new EventBus();eventBus.register(new SimpleListener());eventBus.post("异常测试");}
}
执行结果:
listener1异常并没有影响listener2的执行。