1. 程式人生 > >【初學】Spring原始碼筆記之零:閱讀原始碼

【初學】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的示例。 ``` // 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. 記錄學習知識 學習之後整理下原始碼內容,捋一下