【初學】Spring原始碼筆記之零:閱讀原始碼

鳴黎發表於2020-07-10

筆記要求

  • 瞭解Java語言
  • 瞭解Spring Framework的基礎
  • 會使用Maven

關於本筆記

起因

  1. 本職資料分析,為公司內部人員開發資料處理系統,使用了Python/Django+Bootstrap的選型,完成後不甚滿意,便試著學習C#,第一次接觸C#的Web框架完全懵了,後來才轉向Java,有了懵過之後的C#/Web資料經驗,大概明白了Spring Framework的門道,發現Spring其實應該與C#/Web差不多吧。
  2. 大概明白了Spring Springwork的編寫,到使用Spring Security時,嗯~複製這段配置程式碼到這裡確實可以執行起來;咦?我怎麼配置才能達到這種要求?
  3. 開始搜尋Spring Security資料,對於其原理的解釋,或太深或太淺或僅在概念層次,於是想深挖其詳細原理。使用我心愛的Chrome瀏覽器到開啟Spring Security官網文件,右上角的翻譯按鈕正待蠢蠢欲動,我的天!那麼多!不管了,開始讀,咦?怎麼搞的,好多概念上的東西。不是我想要的,於是想著開始閱讀原始碼。
  4. 在幾個月以前就試著讀原始碼,但是到昨天才感覺到自己會看原始碼。

該筆記水平

  • 不怎麼地
  • 但不能保證該筆記面向Spring的初學者

原始碼初次閱讀技巧

不知道能不能適用於別人。

由於在筆記中不會詳細介紹Spring的基礎,要求可以看懂以下示例程式碼

1. 定一個目標

即為什麼要讀原始碼?想從原始碼中得到什麼?

比如在一些Spring基礎資料中常出現的使用ApplicationContext獲取Bean的示例。

// https://gitee.com/exidot/ssn/blob/master/sf5/src/main/java/cn/exidot/ssn/sf5/Main.java
public class Main {

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("application_context.xml");
        Duck duck = context.getBean("duck", Duck.class);
        duck.tryFly();
    }
}

那麼問題來了:

  • BeanFactory作為Spring概念中的一個核心概念,與ApplicationContext的關係是怎樣的?
  • Spring Framework框架是如何實現的ApplicationContext?
  • ClassPathXmlApplicationContext是如何解析application_context.xml和載入Bean的?
  • 關於單例Bean與Prototype多例Bean在Spring中的生命週期如何?
  • ...

2. 檢視相關類繼承結構

作為初學,學習ApplicationContext,需要先找到它的一個實現類,從實現類入手會更容易。

這是用Idea生成的ClassPathXmlApplicationContext類圖:

3. 先大概看一下類圖結構,從上而下依次閱讀原始碼

我的閱讀方式是:

  • 官網API Doc文件先檢視各欄位與函式的程式碼文件(原始碼中也有,但是複製到Google 翻譯中會存在註釋符號)
  • 然後在Idea中檢視原始碼實現
  • 在閱讀函式等程式碼時,遇到不懂的類跟進去檢視
  • 注意你閱讀原始碼想要得到的知識,不必跟讀的過分細緻。

4. 記錄學習知識

學習之後整理下原始碼內容,捋一下思路。

相關文章