來源:https://www.toutiao.com/i6764940257172390403/
作者:java架構設計
本文主講Spring的事件機制,意圖說清楚:
- 什麼是觀察者模式?
- 自己實現事件驅動編程,對標Spring的事件機制
- 徹底搞懂Spring中的事件機制,從而讓大家
本文內容較長,代碼乾貨較多,建議收藏後持續閱讀。
Spring框架已然是Javaeee開發領域的霸主,無論是使用SpringBoot還是SpringCloud,都離不開Spring框架。
作爲Java開發者,無論是面試求職還是日常開發,就必須得熟練掌握、運用Spring框架。
因此學習Spring框架源碼也就成爲了大家最重要的事情之一。
Spring框架中用到的設計模式
Spring框架中運用了大量的設計模式,如果對設計模式掌握的不夠熟練,閱讀源碼的時候就會感到很喫力,不明白作者爲什麼這樣寫,有時候一個方法一個方法的跟進去,到達一定的深度之後就斷了,無法連貫起來,最後不得不放棄。
簡單工廠,又叫靜態工廠方法模式:Spring中的BeanFactory。
工廠方法模式:Spring中的FactoryBean。
單例模式:Spring中的BeanFactory就是全局單例的,我們日常開發的service默認也是單例模式,單例存在於Spring容器中。
適配器模式:Spring中的AOP、攔截器。
包裝器模式:Spring中的各種Wrapper、Decorator。
代理模式:Spring中的AOP就是採用的代理模式,代理有JDK動態代理(JdkDynamicAopProxy)和Cglib代理(Cglib2AopProxy)兩種方式。
觀察者模式:Spring中的ApplicationListener,事件驅動編程思想。
策略模式:Spring中在實例化對象的時候用到Strategy模式。
模板方法:Spring中的JdbcTemplate、RestTemplate、RedisTemplate等。
熟練掌握以上設計模式可以在閱讀Spring、SpringBoot等框架源碼的時候,可以做到暢通無阻。
觀察者模式
當一個對象發生改變時候,自動通知其他對象作出相關動作。
當一個事件發生時候,自動觸發依賴這個事件的其他事件。
這就是觀察者模式要做的事情。
舉例:當一個開通會員的訂單支付完成之後(第三方支付回調過來了),需要更改訂單的支付狀態、給用戶開通會員、如果有分銷的邏輯還要觸發分潤邏輯、給用戶開通其他會員附屬權益。僞代碼如下:
這種做法是最簡單也是最low的方法,如果再有其他業務需要依賴訂單回調的話,那麼需要訂單業務開發人員持續的在這裏添加相關業務,或同步或異步調用。
那麼如果我發佈一個訂單事件呢?需要監聽該事件的其他業務組自己訂閱這個事件就好了,訂單業務的開發同學再也不用改動自己業務的代碼了。
單體應用下我們通常使用事件驅動的編程模式。分佈式應用下大家都會採用消息隊列發佈-訂閱的模式去做這塊事情。無論採用哪種方式,其核心思想都是觀察者模式。
觀察者模式中有幾個角色:
- 主題:主題中包含多個觀察者,以及觀察者的添加、刪除,同時需要提供觸發觀察者事件的方法。
- 觀察者:也叫監聽器,會有多個觀察者,不同的觀察者監聽到事件後做不同的邏輯處理。
自己實現事件驅動編程
先定義好事件的設計,類圖如下:
事件定義類圖
Event:事件的接口類,可以設置或獲取數據EventObject
Event
AbstractEvent:事件抽象實現類,持有EventObject對象,並提供默認實現
AbstractEvent
OrderCallbackEvent:訂單回調事件,用於定義具體的事件
OrderCallbackEvent
然後我們來定義事件的監聽器(觀察者),以及事件廣播器(主題),類結構設計如下圖:
EventListener:監聽器接口類,定義監聽器的方法
EventListener
AbstractEventListener:監聽器抽象實現類,多了order屬性,用於監聽器執行順序
AbstractEventListener
Test1EventListener:事件監聽器1
Test1EventListener
Test2EventListener:事件監聽器2
Test2EventListener
Test3EventListener:事件監聽器3
Test3EventListener
OrderEventMulticaster:事件廣播器
EventMulticaster
我們來寫一個測試方法,看看當訂單完成回調的時候是如何觸發這3個監聽器的:
運行輸出:
可以看見,監聽器按照我們給定的order順序依次執行三個監聽器的事件。
上面就是我們自己實現的基於事件驅動的代碼,在這個基礎上我們還可以針對EventMulticaster廣播器再製定特製的OrderEventMulticater以及其他業務的事件廣播器。
另外對於每一個監聽器我們也可以單獨開啓一個獨立的線程異步去執行監聽器裏的業務,而不阻塞訂單回調事件的執行。
當有新的業務需要訂單回調進行觸發的時候,就可以再增加一個Listener到監聽器集合裏面就可以了。不需要再更改訂單回調的業務,達到解耦的效果。
Spring的事件機制
Spring中的事件機制有四個關鍵的類:
ApplicationEvent:事件抽象類,所有的具體事件類都得繼承這個類,支持將數據設置到EventObject中:
Spring中的事件有如下幾種:
ApplicationListener:事件監聽器接口,定義通用方法onApplicationEvent:
ApplicationEventMulticaster:事件廣播器接口,用於事件監聽器的註冊和事件的廣播。
ApplicationEventPublisher:事件發佈者,調用
ApplicationEventMulticaster中的multicastEvent方法觸發廣播器持有的監聽器集合執行onApplicationEvent方法,從而完成事件發佈。
Spring中的每一個具體的事件都跟隨有一堆的監聽器,以及事件的的廣播器和發佈者。
搞清楚Spring的事件機制可以讓我們的Spring的源碼閱讀之路暢通無阻。
喜歡的話可以點點關注,私信小編“資料”可領取學習資料