SpringBoot自動(dòng)配置原理

1、當(dāng)SpringBoot應(yīng)用啟動(dòng)的時(shí)候钻注,就從主方法里面進(jìn)行啟動(dòng)的。

它主要加載了@SpringBootApplication注解主配置類,這個(gè)@SpringBootApplication注解主配置類里邊最主要的功能就是SpringBoot開啟了一個(gè)@EnableAutoConfiguration注解的自動(dòng)配置功能猎莲。

2、@EnableAutoConfiguration作用:

它主要利用了一個(gè)EnableAutoConfigurationImportSelector選擇器給Spring容器中來導(dǎo)入一些組件技即。

3益眉、那么導(dǎo)入了哪些組件呢?

我們來看EnableAutoConfigurationImportSelector這個(gè)類的父類selectImports姥份。

類里面規(guī)定了一個(gè)方法叫selectImports這個(gè)方法郭脂,查看了selectImports這個(gè)方法里面的代碼內(nèi)容就能知道導(dǎo)入了哪些組件了。

在selectImports這個(gè)方法里面主要有個(gè)configurations澈歉,并且這個(gè)configurations最終會(huì)被返回展鸡。

這個(gè)configurations它是獲取候選的配置。

這個(gè)configurations方法的作用就是利用SpringFactoriesLoader.loadFactoryNames從類路徑下得到一個(gè)資源埃难。

4莹弊、那么得到哪些資源呢?

它是掃描javajar包類路徑下的“META-INF/spring.factories”這個(gè)文件涡尘。

那么掃描到的這些文件作用:是把這個(gè)文件的urls拿到之后并把這些urls每一個(gè)遍歷忍弛,最終把這些文件整成一個(gè)properties對象。

然后它從properties對象里邊獲取一些值考抄,把這些獲取到的值來加載我們最終要返回的這個(gè)結(jié)果细疚,這個(gè)結(jié)果就是我們要交給Spring容器中的所有組件,這相當(dāng)于這factoryClassName就是我們傳過來的Class的這個(gè)類名川梅。

而傳過來的Class是調(diào)用這個(gè)getSpringFactoriesLoaderFactoryClass()這個(gè)方法得到從properties中獲取到EnableAutoConfiguration.class類名對應(yīng)的值疯兼。

然后把它們添加在容器中。

5贫途、按照它的這個(gè)意思吧彪,來到第二個(gè)Springjar包的META-INF下的spring.factories這個(gè)文件找到配置所有EnableAutoConfiguration的值加入到Spring容器中

所以說我們?nèi)萜髦凶罱K會(huì)添加很多的類

比如:

每一個(gè)xxxAutoConfiguration類都是容器中的一個(gè)組件,并都加入到容器中丢早。

加入到容器中之后的作用就是用它們來做自動(dòng)配置

這就是Springboot自動(dòng)配置之源姨裸,也就是自動(dòng)配置的開始

只有這些自動(dòng)配置類進(jìn)入到容器中以后,接下來這個(gè)自動(dòng)配置類才開始進(jìn)行啟動(dòng)

6怨酝、每一個(gè)自動(dòng)配置類進(jìn)行自動(dòng)配置功能

以一個(gè)自動(dòng)配置類HttpEncodingAutoConfiguration(HTTP的編碼自動(dòng)配置)為例子來解釋SpringBoot的自動(dòng)配置之原理:

? 1). 這個(gè)HttpEncodingAutoConfiguration類上面標(biāo)注了一大堆的注解:

點(diǎn)進(jìn)去HttpEncodingProperties這個(gè)類傀缩,發(fā)現(xiàn)這個(gè)HttpEncodingProperties類上面標(biāo)注了@ConfigurationProperties注解。

所以說配置文件中該配置什么凫碌,我們就按照它的這個(gè)旨意扑毡,它要配spring.http.encoding這個(gè)屬性,這個(gè)屬性里邊能配置什么值盛险,就對應(yīng)HttpEncodingProperties這個(gè)類來配置瞄摊,所有的配置文件中能配置的屬性都是在xxx.Properties類中封裝著勋又。

所以說配置文件能配置什么就可以參照某一個(gè)功能對應(yīng)的這個(gè)屬性類

7、這個(gè)HttpEncodingProperties類就是根據(jù)當(dāng)前不同的條件判斷换帜,決定這個(gè)配置類是否生效楔壤。

如果一旦生效了,所有的配置類都成功了惯驼,就給容器中添加各種組件蹲嚣,這些組件的屬性是從對應(yīng)的properties類中獲取的,而這properties類里邊的每一個(gè)屬性又是和配置文件綁定的祟牲。

我們可以再深入的看一下properties隙畜。

我們看到properties是HttpEncodingProperties,也就是說HttpEncodingProperties這個(gè)對象的值它是獲取配置文件的值的说贝,所以我們在配置這個(gè)filter到底要用什么編碼的時(shí)候是從properties獲取的议惰。

而且值得注意的是:

這個(gè)HttpEncodingAutoConfiguration只有一個(gè)有參構(gòu)造器,在只有一個(gè)有參構(gòu)造器的情況下乡恕,參數(shù)的值就會(huì)從容器中拿

8言询、而容器中它怎么去拿到呢?

相當(dāng)于是前面的這個(gè)@EnableConfigurationProperties(HttpEncodingProperties.class) 注解傲宜,這個(gè)@EnableConfigurationProperties注解的作用就是把HttpEncodingProperties.class和配置文件進(jìn)行綁定起來并把HttpEncodingProperties加入到容器中运杭。

接下來這個(gè)自動(dòng)配置類,通過一個(gè)有參構(gòu)造器把這個(gè)屬性拿到函卒,而這個(gè)屬性已經(jīng)和SpringBoot映射了辆憔,接下來要用什么編碼,就是拿到HttpEncodingProperties這個(gè)類里邊的屬性谆趾。

所以SpringBoot能配置什么躁愿,它要設(shè)置編碼,它是獲取properties里邊getCharset里邊的name值沪蓬。

所以就以此類推,配置一個(gè)Spring配置来候,就可以照著HttpEncodingProperties這里邊的來配置跷叉。

比如在application.properties配置文件下配置一個(gè)http.encoding.enabled屬性:

還能配置其他的一些屬性。

比如:

所以我們能夠配置哪些屬性营搅,都是來源于這個(gè)功能的properties類云挟。

有了這個(gè)自動(dòng)配置類,自動(dòng)配置類就給容器中添加這個(gè)filter转质,然后這個(gè)filter就會(huì)起作用了园欣。

用好SpringBoot只要把握這幾點(diǎn):

? 1).SpringBoot啟動(dòng)會(huì)加載大量的自動(dòng)配置類。

? 2).所要做的就是我們需要的功能SpringBoot有沒有幫我們寫好的自動(dòng)配置類休蟹。

? 3).如果有就再來看這個(gè)自動(dòng)配置類中到底配置了哪些組件沸枯,Springboot自動(dòng)配置類里邊只要我們要用的組件有日矫,我們就不需要再來配置了,但是如果說沒有我們所需要的組件绑榴,那么我們就需要自己來寫一個(gè)配置類來把我們相應(yīng)的組件配置起來哪轿。

? 4).給容器中自動(dòng)配置類添加組件的時(shí)候,會(huì)從properties類中獲取某些屬性翔怎,而這些屬性我們就可以在配置文件指定這些屬性的值窃诉。

以上內(nèi)容就是SpringBoot自動(dòng)配置原理的整個(gè)精髓,只要掌握了SpringBoot的原理赤套,我們才能隨心所欲的運(yùn)用飘痛。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市容握,隨后出現(xiàn)的幾起案子敦冬,更是在濱河造成了極大的恐慌,老刑警劉巖唯沮,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脖旱,死亡現(xiàn)場離奇詭異,居然都是意外死亡介蛉,警方通過查閱死者的電腦和手機(jī)萌庆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來币旧,“玉大人践险,你說我怎么就攤上這事〈盗猓” “怎么了巍虫?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長鳍刷。 經(jīng)常有香客問我占遥,道長,這世上最難降的妖魔是什么输瓜? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任瓦胎,我火速辦了婚禮,結(jié)果婚禮上尤揣,老公的妹妹穿的比我還像新娘搔啊。我一直安慰自己,他們只是感情好北戏,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布负芋。 她就那樣靜靜地躺著,像睡著了一般嗜愈。 火紅的嫁衣襯著肌膚如雪旧蛾。 梳的紋絲不亂的頭發(fā)上莽龟,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機(jī)與錄音蚜点,去河邊找鬼轧房。 笑死,一個(gè)胖子當(dāng)著我的面吹牛绍绘,可吹牛的內(nèi)容都是我干的奶镶。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼陪拘,長吁一口氣:“原來是場噩夢啊……” “哼厂镇!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起左刽,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤捺信,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后欠痴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體迄靠,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年喇辽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了掌挚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡菩咨,死狀恐怖吠式,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情抽米,我是刑警寧澤特占,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站云茸,受9級特大地震影響是目,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜查辩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一胖笛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧宜岛,春花似錦、人聲如沸功舀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辟汰。三九已至列敲,卻和暖如春阱佛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背戴而。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工凑术, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人所意。 一個(gè)月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓淮逊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親扶踊。 傳聞我的和親對象是個(gè)殘疾皇子泄鹏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345

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