為什麼要設計eventbus?因為他是領域驅動設計中比不可少的模組,它承擔傳輸資料的作用,它可以解耦模組之間的耦合性。
如何對eventsbus進行定義:1、eventbus是基於jvm內部的資料傳輸系統,不是jms。
2、eventbus的核心物件為event和eventhandler。
eventbus的模組結構如下:
eventservice對外提供各種服務,它依賴queue,bus,annotatin。
queue包為eventservice提供事件源。
bus包提供兩種事件匯流排:classeventbus和topiceventbus。
annotatin包提供兩種註解方式@classeventhandler和@topiceventhandler。
queue包結構如下:
eventqueue本質上阻塞佇列,負責接收事件和提取事件。
bus包結構如下:
eventbus是facade類,統籌classeventbus和topiceventbus,classeventbus和topiceventbus在處理訂閱著、分發事件是相似的,區別在class是針對事件的型別,而topiceventbus針對的主題。以classeventbus的為例,結構如下:
key2list是 是對 map> 中list的封裝,統一各種常用的操作,eventtype2event是個事件型別對應的事件列表,用於快取控制。class2handler儲存事件的訂閱者,classeventbus每發布一次事件,都會class2handler中取得訂閱者。
notifyhandlers(event)是bus乙個關鍵設計點。如果是採用乙個執行緒迴圈處理所有事件的方式,在處理複雜計算的事情時,會影響其他訂閱者。如果是採用每個執行緒對應乙個訂閱者,則在高併發的情況下,執行緒會增加,系統資源佔用率提高。如果是採用executor來應對,則是折中的辦法。
訂閱者想處理classevent,必須實現classeventhandler。
annotation包是以註解的方式來呼叫bus包下各種eventbus。如果想讓業務facade類,監聽某個事件,則給方法加上@classeventhandler或@topiceventhandler。然後讓annotationprocessor呼叫process即可。以classeventhandler對應的模組為例,來介紹其結構:
annotationprocessor的process處理過程如下:
1、從object物件,找出帶有classeventhanlder的函式。
2、把方法和object,整合到proxclasshandler。
3、proxyclasshanlder註冊到eventservice中。
proxyclasshandler最重要的邊上onevent(evenet),它的功能是以反射的方式呼叫指定方法。
最後是介紹eventservice,它的結構很簡單:
其中,最關鍵的時runtask,他繼承runnable類,在run()中,執行緒不停地從eventqueue獲取事件,然後發布給訂閱者。當然runtask在eventservice初始化的時候,就會生成,知道eventservice銷毀。
以上就是事件匯流排的設計思路,最後附上一張最終的類圖。
事件匯流排 EventBus
在非父子元件需要進行通訊的時候,除了vuex之外,還有就是事件匯流排了 eventbus 又稱為事件匯流排。在vue中可以使用 eventbus 來作為溝通橋梁的概念,就像是所有元件共用相同的事件中心,可以向該中心註冊傳送事件或接收事件,所以元件都可以上下平行地通知其他元件,但也就是太方便所以若使用...
vue 事件匯流排 eventBus
父元件向子元件傳遞引數用v bind 子元件向父元件傳遞引數用this.emit 兄弟元件傳參eventbus或者是用vuex進行傳遞 下邊說說eventbus 首先在src的assets的目錄下新建乙個vue bus.js檔案 import vue from vue export default ...
Vue事件匯流排(EventBus)
參考 問題背景 vue中除父子元件通訊外,任意兩個元件間的通訊問題。解決方案 1.使用vuex,共享乙個狀態,通過修改和監聽這個狀態實現元件通訊。2.事件匯流排。思路 根據vue.js文件,vm.on vm.off都是其實例方法,因此我們需要乙個vue例項作為事件匯流排物件。使用方式 第一種 將事件...