EventBus是Guava的事件处理机制,是设计模式中的观察者模式(生产/消费者编程模型)的优雅实现。对于事件监听和发布订阅模式,EventBus是一个非常优雅和简单解决方案,我们不用创建复杂的类和接口层次结构。
1. 首先定义一个事件中心,用于注册或者销毁或发送事件使用
package com.ijson.event;
import com.google.common.eventbus.EventBus;
/**
* desc:事件中心,注册,销毁以及事件的分发
* version: 6.7
* Created by cuiyongxu on 2019/9/3 12:45 PM
*/
public class EventBusCenter {
private static EventBus eventBus = new EventBus();
public static EventBusCenter instance = doCreate();
private static synchronized EventBusCenter doCreate() {
if (instance == null) {
instance = new EventBusCenter();
}
return instance;
}
private EventBusCenter() {
}
public void register(Object obj) {
eventBus.register(obj);
}
public void unregister(Object obj) {
eventBus.unregister(obj);
}
public void post(Object obj) {
eventBus.post(obj);
}
}
2. 定义Consumer,可以理解为license,用于接受事件中心发出事件的处理,咱们定义3个,一个入参是String,一个是Integer(这里要说一下,EventBus不会自动装箱,不能用int接受参数),一个是自定义的一个User对象
package com.ijson.event;
import com.google.common.eventbus.Subscribe;
/**
* desc: 接收String类型的参数
* version: 6.7
* Created by cuiyongxu on 2019/9/3 1:42 PM
*/
public class DataConsumers01 {
@Subscribe
public void method(String msg) {
System.out.println("DataConsumers01 接收String类型参数: " + msg);
}
}
3. 定义一个Integer类型的Consumer
package com.ijson.event;
import com.google.common.eventbus.Subscribe;
public class DataConsumers02 {
@Subscribe
public void method(Integer msg) {
System.out.println("DataConsumers02 接收Integer类型参数: " + msg);
}
}
4. 定义一个User对象
package com.ijson.event.model;
/**
* desc:
* version: 6.7
* Created by cuiyongxu on 2019/9/3 2:33 PM
*/
public class User {
private String id;
private String name;
private Integer age;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", age=" + age +
'}';
}
public static User create() {
User user = new User();
user.setId("1");
user.setName("孙悟空");
user.setAge(560);
return user;
}
}
5. 定义以User为入参的的Consumer
package com.ijson.event;
import com.google.common.eventbus.Subscribe;
import com.ijson.event.model.User;
public class DataConsumers03 {
@Subscribe
public void method(User user) {
System.out.println("DataConsumers03 接收User参数: " + user.toString());
}
}
6. 写个单元测试,跑一下
package com.ijson.event;
import com.ijson.event.model.User;
import org.junit.Test;
import java.util.logging.Logger;
/**
* desc:
* version: 6.7
* Created by cuiyongxu on 2019/9/3 2:38 PM
*/
public class EventBusTest {
private Logger logger = Logger.getLogger(EventBusTest.class.getName());
@Test
public void itest() {
DataConsumers01 dataConsumers01 = new DataConsumers01();
DataConsumers02 dataConsumers02 = new DataConsumers02();
DataConsumers03 dataConsumers03 = new DataConsumers03();
//注册三个监听者
EventBusCenter.instance.register(dataConsumers01);
EventBusCenter.instance.register(dataConsumers02);
EventBusCenter.instance.register(dataConsumers03);
logger.info("============ start ====================");
EventBusCenter.instance.post("post string method");
EventBusCenter.instance.post(123);
EventBusCenter.instance.post(User.create());
logger.info("============ after unregister ============");
// 注销dataConsumers02,接收参数为Integer,
EventBusCenter.instance.unregister(dataConsumers02);
// 不会被执行,因为已经被注销
EventBusCenter.instance.post(123);
// 而其他的则不受影响
EventBusCenter.instance.post("post string method");
EventBusCenter.instance.post(User.create());
logger.info("============ end ============");
}
}
7. 结果输出
信息: ============ start ====================
DataConsumers01 接收String类型参数: post string method
DataConsumers02 接收Integer类型参数: 123
DataConsumers03 接收User参数: User{id='1', name='孙悟空', age=560}
九月 05, 2019 2:45:17 下午 com.ijson.event.EventBusTest itest
信息: ============ after unregister ============
九月 05, 2019 2:45:17 下午 com.ijson.event.EventBusTest itest
信息: ============ end ============
DataConsumers01 接收String类型参数: post string method
DataConsumers03 接收User参数: User{id='1', name='孙悟空', age=560}
以上demo案例已提交到github:https://github.com/ijson/eventbus.git