【初學】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類圖:
![](https://img2020.cnblogs.com/blog/901207/202007/901207-20200710143705337-1944944745.png)
#### 3. 先大概看一下類圖結構,從上而下依次閱讀原始碼
我的閱讀方式是:
- 在[官網](https://docs.spring.io/spring/docs/5.2.7.RELEASE/javadoc-api/)API Doc文件先檢視各欄位與函式的程式碼文件(原始碼中也有,但是複製到Google 翻譯中會存在註釋符號)
- 然後在Idea中檢視原始碼實現
- 在閱讀函式等程式碼時,遇到不懂的類跟進去檢視
- 注意你閱讀原始碼想要得到的知識,不必跟讀的過分細緻。
#### 4. 記錄學習知識
學習之後整理下原始碼內容,捋一下