【EventBus】EventBus 源码解析 ( 注册订阅者总结 | 从封装的数据结构角度分析 EventBus )

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 【EventBus】EventBus 源码解析 ( 注册订阅者总结 | 从封装的数据结构角度分析 EventBus )

文章目录

EventBus 中的重要数据类型

1、subscriptionsByEventType 集合

2、typesBySubscriber 集合





EventBus 中的重要数据类型


从几个关键的数据存储结构角度分析 EventBus 注册订阅者过程 ;



1、subscriptionsByEventType 集合


Map<Class<?>, CopyOnWriteArrayList> subscriptionsByEventType 集合


在 EventBus 中的 subscriptionsByEventType 成员变量 , 保存的是 HashMap 集合 ,


Key 是事件类型对象 ;

Value 是 Subscription 集合 , Subscription 中封装了一个订阅者对象和一个订阅方法 ;

public class EventBus {
  private final Map<Class<?>, CopyOnWriteArrayList<Subscription>> subscriptionsByEventType;
}


在 EventBus.subscribe 方法中 , 获取订阅方法参数类型就是上述 Key 键 ;


 

// 获取订阅方法参数类型 , 可以是任意类型 , 自定义的 MessageEvent 消息类型
        Class<?> eventType = subscriberMethod.eventType;


先封装该 订阅者 对象 与 订阅方法 到 Subscription 中 ,


   

// Subscription 中封装了一个订阅者对象和一个订阅方法 
        Subscription newSubscription = new Subscription(subscriber, subscriberMethod);


然后从 Map<Class<?>, CopyOnWriteArrayList<Subscription>> subscriptionsByEventType 成员变量中获取 对应 消息类型 的 Subscription 集合 ;


如果发现没有该消息类型对应的 CopyOnWriteArrayList<Subscription> 集合 , 则先创建一个集合 , 再放入到 subscriptionsByEventType 成员中 ;


然后在将新封装的 Subscription 对象 , 放到对应的 CopyOnWriteArrayList<Subscription> 集合中 , 注意放入的时候 , 查询是否有设置优先级属性 , 如果有 , 按照优先级顺序放置 ;


   

int size = subscriptions.size();
        for (int i = 0; i <= size; i++) {
          // 处理订阅方法优先级 , 重新进行排列  
            if (i == size || subscriberMethod.priority > subscriptions.get(i).subscriberMethod.priority) {
                subscriptions.add(i, newSubscription);
                break;
            }
        }


这样就完成了 Map<Class<?>, CopyOnWriteArrayList<Subscription>> subscriptionsByEventType 成员的封装工作 ;


该成员变量的作用很明显 , 在发布者发送消息到消息中心后 , 消息中心根据传入的消息类型 , 查找对应的 订阅者实例对象 和 订阅方法 , 可以直接调用对应的订阅方法 ;



2、typesBySubscriber 集合


Map<Object, List<Class<?>>> typesBySubscriber 集合


private final Map<Object, List<Class<?>>> typesBySubscriber; 是 EventBus 的成员变量 ;


Key : 订阅者对象 ;

Value : 订阅方法参数类型集合 ;

可以根据订阅者对象查询 该订阅者对象 中的 订阅方法 中的参数集合 , 根据参数可以到 Map<Class<?>, CopyOnWriteArrayList<Subscription>> subscriptionsByEventType 集合中查询对应的 订阅者对象 和 订阅方法 ;


该 typesBySubscriber 集合的作用很明显 , 在取消注册时 , 可以快速查询到 该订阅者对象 注册了哪些方法 , 将其从 Map<Class<?>, CopyOnWriteArrayList<Subscription>> subscriptionsByEventType 集合中移除 , 就可以达到取消订阅的目的 ;


目录
相关文章
|
23天前
|
JavaScript API 数据安全/隐私保护
【Azure Developer】Azure AD 注册应用的 OAuth 2.0 v2 终结点获取的 Token 解析出来依旧为v1, 这是什么情况!
【Azure Developer】Azure AD 注册应用的 OAuth 2.0 v2 终结点获取的 Token 解析出来依旧为v1, 这是什么情况!
|
29天前
|
测试技术
【初阶数据结构篇】栈的实现(附源码)
在每一个方法的第一排都使用assert宏来判断ps是否为空(避免使用时传入空指针,后续解引用都会报错)。
|
1月前
|
存储
【数据结构】栈和队列-->理解和实现(赋源码)
【数据结构】栈和队列-->理解和实现(赋源码)
24 5
|
1月前
【数据结构】遍历二叉树(递归思想)-->赋源码
【数据结构】遍历二叉树(递归思想)-->赋源码
45 4
|
1月前
【数据结构】二叉树顺序实现(大堆)-->赋源码
【数据结构】二叉树顺序实现(大堆)-->赋源码
31 4
|
1月前
【数据结构】双向带头(哨兵位)循环链表 —详细讲解(赋源码)
【数据结构】双向带头(哨兵位)循环链表 —详细讲解(赋源码)
29 4
|
29天前
|
测试技术
【初阶数据结构篇】队列的实现(赋源码)
首先队列和栈一样,不能进行遍历和随机访问,必须将队头出数据才能访问下一个,这样遍历求个数是不规范的。
|
29天前
|
存储 测试技术
【初阶数据结构篇】单链表的实现(附源码)
在尾插/尾删中,都需要依据链表是否为空/链表是否多于一个节点来分情况讨论,目的是避免对空指针进行解引用造成的错误。
|
1月前
|
存储 缓存 算法
深入解析B树:数据结构、存储结构与算法优势
深入解析B树:数据结构、存储结构与算法优势
|
1月前
|
安全 Nacos 数据库
【技术安全大揭秘】Nacos暴露公网后被非法访问?!6大安全加固秘籍,手把手教你如何保护数据库免遭恶意篡改,打造坚不可摧的微服务注册与配置中心!从限制公网访问到启用访问控制,全方位解析如何构建安全防护体系,让您从此告别数据安全风险!
【8月更文挑战第15天】Nacos是一款广受好评的微服务注册与配置中心,但其公网暴露可能引发数据库被非法访问甚至篡改的安全隐患。本文剖析此问题并提供解决方案,包括限制公网访问、启用HTTPS、加强数据库安全、配置访问控制及监控等,帮助开发者确保服务安全稳定运行。
72 0

推荐镜像

更多