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!歡迎大家關注我!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM