当前位置:网站首页>Google EventBus 使用详解
Google EventBus 使用详解
2022-07-05 13:54:00 【全栈程序员站长】
大家好,又见面了,我是你们的朋友全栈君。
EventBus是Google.Guava提供的消息发布-订阅类库,它实现了观察者设计模式,消息通知负责人通过EventBus去注册/注销观察者,最后由消息通知负责人给观察者发布消息。
首先使用 maven 依赖:
<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>19.0</version>
</dependency>
示例代码:
EventBusCenter.java
package com.lance.google.event.bus;
import com.google.common.eventbus.EventBus;
/**
* Created by zhangzh on 2017/1/10.
*/
public class EventBusCenter {
private static EventBus eventBus = new EventBus();
private EventBusCenter() {
}
public static EventBus getInstance() {
return eventBus;
}
public static void register(Object obj) {
eventBus.register(obj);
}
public static void unregister(Object obj) {
eventBus.unregister(obj);
}
public static void post(Object obj) {
eventBus.post(obj);
}
}
观察者一
package com.lance.google.event.bus;
import com.google.common.eventbus.Subscribe;
/**
* Created by zhangzh on 2017/1/10.
*/
public class DataObserver1 {
/**
* 只有通过@Subscribe注解的方法才会被注册进EventBus
* 而且方法有且只能有1个参数
*
* @param msg
*/
@Subscribe
public void func(String msg) {
System.out.println("String msg: " + msg);
}
}
观察者二
package com.lance.google.event.bus;
import com.google.common.eventbus.Subscribe;
/**
* Created by zhangzh on 2017/1/10.
*/
public class DataObserver2 {
/**
* post() 不支持自动装箱功能,只能使用Integer,不能使用int,否则handlersByType的Class会是int而不是Intege
* 而传入的int msg参数在post(int msg)的时候会被包装成Integer,导致无法匹配到
*/
@Subscribe
public void func(Integer msg) {
System.out.println("Integer msg: " + msg);
}
}
代码测试
Test.java
package com.lance.google.event.bus;
/**
* Created by zhangzh on 2017/1/10.
*/
public class Test {
public static void main(String[] args) throws InterruptedException {
DataObserver1 observer1 = new DataObserver1();
DataObserver2 observer2 = new DataObserver2();
EventBusCenter.register(observer1);
EventBusCenter.register(observer2);
System.out.println("============ start ====================");
// 只有注册的参数类型为String的方法会被调用
EventBusCenter.post("post string method");
EventBusCenter.post(123);
System.out.println("============ after unregister ============");
// 注销observer2
EventBusCenter.unregister(observer2);
EventBusCenter.post("post string method");
EventBusCenter.post(123);
System.out.println("============ end =============");
}
}
输出结果:
============ start ====================
String msg: post string method
Integer msg: 123
============ after unregister ============
String msg: post string method
============ end =============
看使用起来简单吧!
EventBus的使用注意问题:
1.代码可读性很差,项目中使用的时候,从post的地方,查询handle使用,都是使用ide的搜索服务,问题很难定位,不如普通的接口调用方便查询;
2.由于EventBus是将消息队列放入到内存中的,listener消费这个消息队列,故系统重启之后,保存或者堆积在队列中的消息丢失。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/149580.html原文链接:https://javaforall.cn
边栏推荐
猜你喜欢
Wonderful express | Tencent cloud database June issue
Anchor navigation demo
治臻新能源冲刺科创板:年营收2.2亿 上汽创投是股东
[public class preview]: basis and practice of video quality evaluation
laravel-dompdf导出pdf,中文乱码问题解决
Jetpack Compose入门到精通
Those things I didn't know until I took the postgraduate entrance examination
In addition to the root directory, other routes of laravel + xampp are 404 solutions
jasypt配置文件加密|快速入门|实战
Assembly language - Beginner's introduction
随机推荐
SSH免密码登录详解
asp.net 读取txt文件
Laravel框架运行报错:No application encryption key has been specified
牛客网:拦截导弹
What about data leakage? " Watson k'7 moves to eliminate security threats
Solve the problem of invalid uni app configuration page and tabbar
那些考研后才知道的事
About the problem and solution of 403 error in wampserver
2022司钻(钻井)考试题库及模拟考试
Elk enterprise log analysis system
PHP character capture notes 2020-09-14
LeetCode_3(无重复字符的最长子串)
Network security - Novice introduction
Elfk deployment
OSI and tcp/ip protocol cluster
Kafaka log collection
治臻新能源冲刺科创板:年营收2.2亿 上汽创投是股东
Aspx simple user login
Linked list (simple)
基于微信小程序的订餐系统