Spring Boot 自動配置,從源碼角度開始分析;

目錄

  • 前言
  • 源碼版本
  • @SpringBootApplication干了什么?
  • @EnableAutoConfiguration干了什么?
  • 總結(jié)

前言

為什么Spring Boot這么火?因為便捷,開箱即用,但是你思考過為什么會這么便捷嗎?傳統(tǒng)的SSM架構(gòu)配置文件至少要寫半天,而使用Spring Boot之后只需要引入一個starter之后就能直接使用,why???

原因很簡單,每個starter內(nèi)部做了工作,比如Mybatis的啟動器默認(rèn)內(nèi)置了可用的SqlSessionFactory

至于如何內(nèi)置的?Spring Boot 又是如何使其生效的?這篇文章就從源碼角度介紹一下Spring Boot的自動配置原理。

源碼版本

作者Spring Boot是基于2.4.0。每個版本有些變化,讀者盡量和我保持一致,以防源碼有些出入。

@SpringBootApplication干了什么?

這么說吧,這個注解什么也沒做,廢物,活都交給屬下做了,源碼如下:


@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
  @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {}

上方標(biāo)注了三個重要的注解,如下:

  1. @SpringBootConfiguration:其實就是@Configuration,因此主啟動類可以當(dāng)做配置類使用,比如注入Bean等。
  2. @EnableAutoConfiguration:這個注解牛批了,名字就不一樣,開啟自動配置,哦,關(guān)鍵都在這了.....
  3. @ComponentScan:包掃描注解。

經(jīng)過以上的分析,最終定位了一個注解@EnableAutoConfiguration,顧名思義,肯定和自動配置有關(guān),要重點分析下。

@EnableAutoConfiguration干了什么?

想要知道做了什么肯定需要看源碼,如下:


@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {}

上方標(biāo)注了兩個重要的注解,如下:

  1. @AutoConfigurationPackage:自動配置包注解,默認(rèn)將主配置類(@SpringBootApplication)所在的包及其子包里面的所有組件掃描到IOC容器中。
  2. @Import:該注解不必多說了,前面文章說過很多次了,這里是導(dǎo)入了AutoConfigurationImportSelector,用來注入自動配置類。

以上只是簡單的分析了兩個注解,下面將會從源碼詳細(xì)的介紹一下。

@AutoConfigurationPackage

這個注解干了什么?這個需要看下源碼,如下;


@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {}

重要的還是@Import注解,導(dǎo)入了AutoConfigurationPackages.Registrar,這個類是干什么的?源碼如下圖:

其實就兩個方法,但是的最重要的就是registerBeanDefinitions方法,但是這個方法不用看,肯定是注入Bean,這里的重點是注入哪些Bean,重點源碼如下:


//獲取掃描的包
new PackageImports(metadata).getPackageNames().toArray(new String[0])

跟進(jìn)代碼,主要邏輯都在#PackageImports.PackageImports()這個構(gòu)造方法中,源碼解析如下圖:

從上面源碼分析可以知道,這里掃描的包名是由兩部分組成,分別如下:

  1. @AutoConfigurationPackage注解中的兩個屬性解析得來的包名。
  2. 注解AutoConfigurationPackage所在的包名,即是@SpringBootApplication所在的包名。

@AutoConfigurationPackage默認(rèn)將主配置類(@SpringBootApplication)所在的包及其子包里面的所有組件掃描到IOC容器中。

@Import(AutoConfigurationImportSelector.class)

這個注解不用多說了,最重要的就是AutoConfigurationImportSelector,我們來看看它的繼承關(guān)系,如下圖:

這個類的繼承關(guān)系還是挺簡單的,實現(xiàn)了Spring中的xxAware注入一些必要的組件,但是最值得關(guān)心的是實現(xiàn)了一個DeferredImportSelector這個接口,這個接口擴(kuò)展了ImportSelector,也改變了其運行的方式,這個在后面章節(jié)會介紹。

「注意」:這個類會導(dǎo)致一個誤區(qū),平時看到xxxSelector已經(jīng)有了反射弧了,肯定會在selectImports()方法上DEBUG,但是這個類壓根就沒執(zhí)行該方法,我第一次看也有點懷疑人生了,原來它走的是DeferredImportSelector的接口方法。

其實該類真正實現(xiàn)邏輯的方法是process()方法,但是主要加載自動配置類的任務(wù)交給了getAutoConfigurationEntry()方法,具體的邏輯如下圖:

上圖的邏輯很簡單,先從spring.factories文件中獲取自動配置類,在去掉@SpringBootApplication中定義排除的自動配置類。

上圖中的第步就是從META-INF/spring.factories中加載自動配置類,代碼很簡單,在上一篇分析啟動流程的時候也有很多組件是從spring.facotries文件中加載的,代碼都類似。

springboot-autoconfigure中的spring.facotries文件內(nèi)置了很多自動配置類,如下:


# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\
org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\
org.springframework.boot.autoconfigure.context.LifecycleAutoConfiguration,\
org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration,\
................

了解了Spring Boot 如何加載自動配置類,那么自定義一個自動配置類也是很簡單了,后續(xù)章節(jié)教你如何定制自己的自動配置類,里面還是有很多門道的.....

總結(jié)

本文從源碼角度分析了Spring Boot的自動配置是如何加載的,其實分析起來很簡單,希望作者的這篇文章能幫助你更深層次的了解Spring Boot

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,117評論 6 537
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,860評論 3 423
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,128評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,291評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,025評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,421評論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,477評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,642評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,177評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,970評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,157評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,717評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,410評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,821評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,053評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,896評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,157評論 2 375

推薦閱讀更多精彩內(nèi)容