準備工作:
1.選擇乙個好工具idea (eclipse 也可以,本文主要是以idea為例講解)
debug教程見:
知識準備:
1.了解常用設計模式:模板模式 、策略模式、**模式(jdk內建的**模式實現機制)、工廠模式、單體模式等等
2.uml類圖和物件導向設計原則srp
:單一職責原則。乙個類應僅有乙個改變的理由。ocp
:開閉原則。不應修改已有的類,而應擴充套件乙個類。lsp
:黎克特制替換原則。子類物件能隨時隨地替換其超類。isp
:介面分離原則。乙個客戶程式只需關注自己所需要的介面。dip
:依賴倒置原則。依賴抽象而避免依賴細節
coc : 慣例優先原則 convention over configuration
ps:a.設計模式和uml類圖,可以幫助理順框架內部介面的呼叫關係,和介面的具體實現;
b.框架都是高度抽象的,直接看原始碼都是介面之間的呼叫;借助ieda debug功能,能快速找到具體的實現類;
如何跟蹤框架原始碼?以springboot中使用security為例。
1.從配置基類websecurityconfigureradapter入手:
websecurityconfigureradapter
public void configure(authenticationmanagerbuilder auth) throws exception
2. 檢視類**,並繪製uml類圖 :
檢視從authenticationmanagerbuilder的注釋,大概看一下注釋中提到的類和介面,將其畫到uml圖中;
a.檢視具體實現類,要避免陷入細節中去,乙個具體實現類由大量的成員變數和方法構成,但要記住實現類是介面的實現,通常乙個介面只做一件事而已(這個就是單一職責原則),重點看實現類如何實現介面方法,其他方法都是為介面方法實現服務的。
b.使用慣例優先原則,從類名來了解使用其使用到的設計模式,如authenticationmanagerbuilder,builder結尾的按慣例是表示生成器模式;
這時就要對該模式有個大致的認識,該模式一般用於複雜物件的初始化。
生成器模式的介紹:
c.為了解耦和重用**,通常是實現類實現介面時,通常會繼承至乙個抽象類(基類中包含公用**),模板模式中會大量使用該技巧。
d.繪製uml圖時,必須將介面的方法寫上,因為是介面定義了框架的核心。基類上將抽象方法寫上去。
看看authenticationmanagerbuilder
的類圖結構,仔細觀察uml標註出來的方法
authenticationmanagerbuilder如何實現的
,很容易看出
authenticationmanagerbuilder最終會生成providermanager。另外乙個類似的介面實現 httpsecurity httpsecurity 會生成 defaultsecurityfilterchain 。
3.通過步驟2,我們了解到配置最終會生成providermanager 和 defaultsecurityfilterchain ,這兩個類肯定是非常有用的,這時我們可以在providermanager的介面定義方法和構造方法上打上斷點,因為介面上的方法是重點,構造方法能找到實現介面所依賴的其他類,其他定義的方法都是為該方法服務的。
4.執行起來,我們可以看到providermanager初始化的過程,我們會看到實際初始化時會用到哪些類,將它在uml畫出來,並標註成紅色,因為這些類是框架介面的預設實現類。
5.從第4步開始,可以開始向下找providermanager依賴了哪些類來實現介面定義的方法。還可以向上找到哪些類呼叫了providermanager,怎麼找?使用idea找介面方法被哪些類呼叫,find usages 。
從上面看到usernamepasswordauthenticationfilter有呼叫介面方法,右鍵jump to type source ,看看如何呼叫的。
到這裡,大部分搞j2ee開發的就比較熟悉啦。從request中獲取使用者名稱密碼,然後交給authenticationmanager進行驗證。
重複4,5兩個步驟,打斷點找到介面的具體實現,find useage 查詢類如何被其他類依賴使用,整個的框架邏輯就出來啦。
總結:1.從配置檔案,配置類找到切入點;切入點通常是乙個類,不是乙個介面。畫出類和介面之間的類圖,找到類的核心方法(即實現的介面方法)
2.以切入點為據點,向上查詢呼叫者,向下查詢被呼叫者;呼叫鏈條慢慢就浮現啦。
3.然後再將鏈條上關鍵的介面找出來,找出它的實現類,借助uml圖,整個框架的概貌就出來啦。
4.對設計模式的熟悉程度,和紮實的oo基礎有助於快速理解框架作者的編碼意圖,更好的閱讀**。如果沒有這樣的基礎,閱讀**就會很費力。
5.好的開源框架命名很規範,遵循慣例優先原則,看看類名基本上就能知道使用的設計模式是什麼。有了設計模式,基本上就能猜到作者會去怎麼寫**了。還是第4點,設計模式其實就類似與中國功夫裡的拳法套路。
OKHttp開源框架學習七 快取策略原始碼分析
目錄 系列文章 體現 cache類的put方法 cache類的get方法 okhttp開源框架學習一 同步請求總結 okhttp開源框架學習二 非同步請求總結 okhttp開源框架學習三 任務排程核心類dispatcher okhttp開源框架學習四 okhttp開源框架學習五 之retryandf...
如何學習開源框架?
前短時間被人問起 如何學習開源框架 這個問題,大家是如何學習開源框架的呢?整理了下自己的思路,僅供拍磚!1 了解 先了解該開源框架在什麼背景下誕生的,主要用來解決什麼問題。做了產品經理之後遇到啥事,我都先講背景,生怕客戶聽不懂 2 熟悉 這個開源框架的原理是什麼?比如用了什麼設計模式。比如運用了反射...
如何學習開源框架
正確的學習方法不僅能夠事半功倍,也能夠使我們更加接近真理。在大家了解了框架的本質和web開發模式之後,我們來討論一下學習開源框架和基本方法。在這裡,本書為大家小結了一些正確的學習方法和最佳實踐,這些不僅是筆者多年開發中的心得體會,也汲取了網路上的大家之言,希望對初學者或者正在為學習開源框架犯愁的朋友...