更新時間:2024-05-03 10:09:13作者:佚名
前言
我最近寫的系列文章得到了很多讀者的好評,也有讀者希望我多寫這方面的文章。 甚至有讀者私信我,問我如何閱讀源碼。 為此,我打算寫一系列的源碼解讀來回饋一直支持我的粉絲們。
不知道你是否有以下經歷:
源代碼非常復雜。 說實話,這種文章很難寫。 很難解釋清楚。 寫完之后會很長。 讀者可能沒有耐心讀下去,讀完后很容易忘記。
我打算采用圖文結合的方式,去其糟粕,只解讀一些精華部分,讓讀者在閱讀源碼時有一個清晰的思路,不至于迷失方向。 最重要的是,看完之后你能記住很多關鍵流程。
在龐大的系統中,IOC(控制反轉)貫穿始終,其作用不言而喻。 我們先從IOC開始,介紹一下它的主要流程,給有需要的朋友一些指導。
入口
容器的頂層接口是:,但是我們使用更多的是它的子接口:。
通常,如果我們想手動初始化一個通過xml文件配置的容器,代碼如下:
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User)applicationContext.getBean("name");
如果想手動初始化通過配置類配置的容器,代碼如下:
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Config.class);
User user = (User)applicationContext.getBean("name");
這兩個類應該是最常見的入口,但卻殊途同歸。 最終他們會調用一個方法,這才是容器初始化的真正入口。
順便說一句,這些并不是唯一調用方法的兩個類。 我們用一張圖來整體理解一下:
雖然調用方法的類有很多,但我還是決定以類為例來給大家講解一下,因為它足夠經典,而且相對來說難度不那么大。
我再說一遍,由于源代碼量巨大,即使我能一口氣讀完,恐怕你也沒有耐心讀下去。 所以我會采用Hello, Me的方式,忽略一些細節,只關注關鍵點。 如果有對某些細節感興趣的同學,請加我微信與我交流,或者關注我后續的文章,會詳細講解。
方法
該方法是ioc的真正入口,負責初始化容器。
既然這個方法的作用是初始化容器,為什么這個方法不叫init呢?
答案很簡單,因為它不僅僅被調用一次。
類中的run方法會調用該方法,該方法會調用一次該方法。
類中的方法會調用類中的run方法。 該方法也將被調用一次。
這就是為什么項目中引入該方法會被調用兩次的原因。
類中的ntext方法會調用該方法,該方法會調用一次該方法,但是會提前判斷容器是否被激活。
所以這里的意思是重建。
好了,不廢話了。 以下是需要重點關注的關鍵步驟:
其實上圖中乍一看似乎方法很多,但真正核心的方法卻并不多。 我主要講一下最重要的幾個:
解析xml配置文件
ry方法會解析xml bean配置,生成對象,并注冊到容器中(說白了就是在很多map集合中)。
經過幾層調用(不詳述,很簡單),就會調用該類的方法:
該方法將循環(.xml 文件路徑)ioc是什么意思,調用另一個方法,并逐個解析每個文件。
經過一系列運算后,會轉化為和,然后轉化為對象進行分析。
解析xml文件時,需要判斷它是默認標簽還是自定義標簽。 處理邏輯不同:
只有 4 個默認標簽:
對應的處理方法為:
注意:,,等都是自定義標簽。
從上圖中處理標簽的n方法開始,經過一系列的調用,最終會轉入類的n方法。
該方法包含關鍵步驟:解析元素生成和注冊。
自定義屬性的內容很有趣,這里不再贅述。 現在用得不多了。 有興趣的同學可以加我微信,私聊我。
產生
讓我們重點關注它是如何生成的。
上面的方法會調用類方法:
一個標簽將對應一個對象。
該方法會調用同名的重載方法:n,真正創建對象,并解析一系列參數來填充對象:
其實實際的創建邏輯很簡單,直接new一個對象:
真正的復雜性在于前面屬性的解析和賦值。
登記
通過解析上面的xml文件生成了很多對象。 接下來,您需要將對象注冊到容器中,以便容器可以初始化bean。
Utils類中的on方法非常簡單,只有兩個過程:
我們先看一下類的on方法是如何注冊的:
接下來我們看看類方法是如何注冊alias別名的:
這樣就可以通過多個不同的別名找到同一個名字,然后再通過名字找到。
修訂
上面的對象已經注冊到容器中了。 接下來,如果我想修改注冊的對象該怎么辦呢?
通過方法中的方法修改對象。
經過一系列的調用,最終會到達類方法:
流程看上去很長,但實際上邏輯比較簡單,主要是處理和ssor。
它本身就是一個特殊的ssor。 它還會執行 ssor 的邏輯,但它只是添加了一個額外的方法。
也許最重要的是,它處理@注釋。
登記
處理完前面的邏輯后,該方法就會調用注冊。 它的功能非常強大,將在后面的文章中詳細講解。
經過一系列的調用,最終會到達類方法:
注意ioc是什么意思英語作文,這一步只是注冊,實際使用稍后再說。
總結
之前主要介紹過:
容器初始化的入口點
該方法的主要流程
解析xml配置文件
產生
登記
修訂
登記
以上內容只是容器初始化的前期準備工作。 先給大家預覽一下,真正的表演在后面:實例化bean、依賴注入、初始化bean、調用等等。
親愛的朋友們,展開公眾號右上角“設為星標”即可立即看到我的好文章。 它純粹是提供信息的。 錯過實在可惜。