來源:北大青鳥總部 2023年01月11日 10:40
目前微服務已是企業(yè)標配,鑒于很多小伙伴還只是停留在知其然,確不知其所以然的情況,這里給大家總結一下SpringBoot的自動裝配原理。
后面有些內容老師就是基于SpringBoot這種源碼的自動裝配原理的來直接寫代碼的,如果你明白了SpringBoot的自動裝配原理,對于后面學習將會更加輕車熟路。
首先對于一個SpringBoot工程來說,最明顯的標志的就是@SpringBootApplication它標記了這是一個SpringBoot工程,所以今天的SpringBoot自動裝配原理也就是從它開始說起。
首先我們來看下@SpringBootApplication這個注解的背后又有什么玄機呢?
我們按下Ctrl+鼠標左鍵,輕輕的點一下,此時見證奇跡的時刻...
我們看到如下優(yōu)雅的代碼
這其中有兩個比較容易引起我們注意的地方:
一個是@SpringBootConfiguration注解
一個是@EnableAutoConfiguration注解
之所以說這個兩個注解比較吸引我們的眼球,是因為其他的注解我們都比較熟悉,即使不知道他們是干什么的,但也可以肯定跟自動裝配是沒有關系的。
于是我們伸出了邪惡的小手,開啟了熟悉的操作,按下了Ctrl +鼠標左鍵,瞪著色咪咪的小眼睛,瞳孔放大了百倍等待著奇跡的出現(xiàn)...
什么也沒有...... 那我要你有何用,這么頂級的世界級的開源項目,怎么會讓一個沒用的家伙存在呢?于是動用了上億的腦細胞大軍,經(jīng)過復雜的運算,得出了一個不靠譜的結論它可能使用來標記這是一個SpringBoot工程的配置。
因為SpringBootConfiguration翻譯過來就是SpringBoot的配置。
氣定神閑之后,秉承著"失敗是成功之母"的信念, 熟練的左手行云流水般的按下了Ctrl + Table鍵,回到了最初的的地方。
眼睛盯著@EnableAutoConfiguration ,環(huán)顧左右,在地址欄輸入了谷歌翻譯,結果顯示自動裝配。我找的就是你,真是眾里尋他千百度,那人卻在燈火闌珊處。熟練的按下了Ctrl +左鍵。
進入了AutoConfigurationImportSelector.class類,因為谷歌翻譯告訴我們,這個是自動配置導入選擇器。于是我們發(fā)現(xiàn)了一片新天地
而這個自動配置的實體AutoConfigurationEntry里面有兩個屬性,configurations和exclusions。
在后面可以看到getAutoConfigurationEntry()方法返回了一個對象return newAutoConfigurationEntry(configurations, exclusions)這里也就是把我們需要的配置都拿到了。
那這是怎么拿到的候選配置類呢?我們接著看這個獲取候選配置類的方法。
進到方法后我們看到下面這個方法具體獲取候選配置類的方法內容
這里我們跟著斷點去走,首先進入getSpringFactoriesLoaderFactoryClass()方法
接著我們在進入getBeanClassLoader()方法,這里就是一個類加載器
最后我們在進入loadFactoryNames()方法,這個方法就是根據(jù)剛才的字節(jié)碼文件和類加載器來找到候選的配置類。傳遞過來的字節(jié)碼
如下圖:
最后通過loadSpringFactories()來獲取到所有的配置類
這里我們要看下怎么從資源目錄下FACTORIES_RESOURCE_LOCATION加載的下面是加載配置文件的路徑
也就是項目啟動的時候會去加載所有META-INF下的所有的spring.factories文件,我們搜一下這個這個文件,我搭建的是一個最簡單的SpringBoot工程,它會去這三個jar里面找相關的配置類。
但是最后自動裝配的類是這個spring-boot-autoconfigure-2.1.5.RELEASE.jar
而根據(jù)EnableAutoConfiguration.class字節(jié)碼加載的配置類就只有這118自動配置類
實際上SpringBoot的自動裝配原理,其實就是在項目啟動的時候去加載META-INF下的spring.factories文件。
當然在啟動的過程中還會有其他的配置項的加載,這里咱么主要介紹自動裝配的加載過程。希望對大家可以有所啟發(fā)。