1. 程式人生 > >Spring Boot自動裝配

Spring Boot自動裝配

前言

一些朋友問我怎麼讀原始碼,這篇文章結合我看原始碼時候一些思路給大家聊聊,我主要從這三個方向出發:

  1. 確定目標,這個目標要是一個具體,不要一上來我要看懂Spring,這是不可能的,目標要這麼來定,比如看懂Spring Boot的自動裝配、Spring IOC XML載入流程等等,儘量小,能夠快速搞定的,不要目標太大,陷入其中,反而效果不好;
  2. 學會猜,這個猜字其實很有精華,這個可能需要大家積累一段時間才能猜的很準,高手其實都是用猜的,我還沒有達到這個境界,但是也是稍微有了一些門道,這個第二點看能力可適當應用;
  3. 學會看堆疊資訊,這個其實很重要,剛開始看原始碼的時候可能是很重要的手段,一下基本上就可以看到很多很多步驟,到時候可以進行反推理;
    接下來給大家演示一下,我是怎麼來看Spring Boot自動裝配的,希望大家能有些收穫!

確定目標

看Spring Boot的自動裝配流程,這個目標是個具體目標,為什麼說他是一個具體目標,這裡我們來思考一下,在Spring時代我們都是用配置檔案來搞定的,到了Spring Boot時代我們就可以擺脫了配置,我們的目標就是看明白Spring Boot都是幫助我們做了什麼,這裡我們在把這個目標更具體一點,我們看一下Redis是怎麼被Spring Boot自動裝配的。首先我們先把Redis和Spring Boot整合起來,看一下整合過程。


上面我們確定了目標並且完成整合,我們在程式中唯一看到就是@SpringBootApplication這個註解,那我們就跟著註解看下去,這裡就開始猜的精華了。


重點部分就是紅色標註的部分,接下來我們繼續往下看,

這個@Import註解也是最重要的部分,我們接下來繼續往下看,

在AutoConfigurationImportSelector這個類中有getAutoConfigurationEntry這個方法,看這個方法的英文解釋是,大致上是基於@Configuration註解返回自定義的實體AutoConfigurationEntry,感覺好像我們猜對了,看見我標註斷點的地方getCandidateConfigurations這個方法,接下來我們繼續往下走一走;



我們看到是載入一個配置檔案地址,接下來我們去看一下配置檔案中有什麼東西,


在這個配置檔案中我們看到了RedisAutoConfiguration,看到這裡我推測可能我猜的比較正確,我們看下整個類;

主要看標紅的地方,@EnableConfigurationProperties這個註解是匯入配置註解,@Import這個註解是連線池配置資訊,@Bean是Bean配置資訊的匯入,到這個地方我們基本上我們已經完成自己的猜測,接下來我們就進行驗證;

如上圖,我們猜測和驗證已經吻合,這個時候我們已經可以得出Spring Boot自動載入原理,總結一下:
@SpringBootApplication等同於下面三個註解:
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
其中@EnableAutoConfiguration是關鍵(啟用自動配置),內部實際上就去載入META-INF/spring.factories檔案的資訊,然後篩選出以EnableAutoConfiguration為key的資料,載入到IOC容器中,實現自動配置功能。

 

學會看堆疊資訊

驗證完成以後我們再來深挖一下底層一些東西,我們來看下呼叫的堆疊資訊;


紅色標註地方,我們看到一個相對比較熟悉的方法refresh,然後繼續看堆疊資訊通過呼叫invokeBeanFactoryPostProcessors方法,通過看註釋該處是執行BeanFactoryPostProcessor介面,有文章介紹過BeanFactoryPostProcessor這個介面,

大家可以去檢視一下這篇文章,這裡就不進行介紹了,我們繼續看堆疊資訊,

接下來我們看到ConfigurationClassPostProcessor類中的processConfigBeanDefinitions方法,該類繼承結構如下

斷定該類主要就是向容器中注入Bean資訊,繼續向下看堆疊資訊,發現通過呼叫該parse方法,最終解析在ConfigurationClassParser類中完成,

完成各種配置解析,我們重點關注下deferredImportSelectorHandler的process方法,


processGroupImports方法通過遍歷DeferredImportSelectorGrouping,該類是個靜態的匿名類,內部實現迭代方法,

接下來看AutoConfigurationImportSelector的process方法,

這裡重點就來了,這裡就將開始斷點的呼叫鏈串連起來了,相信大家看到這裡已然無惑。

 

結束

歡迎大家加群438836709!歡迎大家關注我!