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

筆記要求

  • 了解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的示例。

// //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. 記錄學習知識

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