來源: https://www.toutiao.com/i6764...java
做者:java架構設計
本文主講Spring的事件機制,意圖說清楚:面試
本文內容較長,代碼乾貨較多,建議收藏後持續閱讀。
Spring框架已然是Javaeee開發領域的霸主,不管是使用SpringBoot仍是SpringCloud,都離不開Spring框架。編程
做爲Java開發者,不管是面試求職仍是平常開發,就必須得熟練掌握、運用Spring框架。設計模式
所以學習Spring框架源碼也就成爲了你們最重要的事情之一。架構
Spring框架中運用了大量的設計模式,若是對設計模式掌握的不夠熟練,閱讀源碼的時候就會感到很吃力,不明白做者爲何這樣寫,有時候一個方法一個方法的跟進去,到達必定的深度以後就斷了,沒法連貫起來,最後不得不放棄。app
簡單工廠,又叫靜態工廠方法模式: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中的事件機制有四個關鍵的類:
ApplicationEvent:事件抽象類,全部的具體事件類都得繼承這個類,支持將數據設置到EventObject中:
Spring中的事件有以下幾種:
ApplicationListener:事件監聽器接口,定義通用方法onApplicationEvent:
**
ApplicationEventMulticaster:事件廣播器接口**,用於事件監聽器的註冊和事件的廣播。
ApplicationEventPublisher:事件發佈者,調用
ApplicationEventMulticaster中的multicastEvent方法觸發廣播器持有的監聽器集合執行onApplicationEvent方法,從而完成事件發佈。
Spring中的每個具體的事件都跟隨有一堆的監聽器,以及事件的的廣播器和發佈者。
搞清楚Spring的事件機制可讓咱們的Spring的源碼閱讀之路暢通無阻。
喜歡的話能夠點點關注,私信小編「資料」可領取學習資料