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