Spring Boot 自動(dòng)化配置原理帶圖全面講解

# Spring Boot 自動(dòng)化配置原理

> 我們經(jīng)常使用Spring Boot,是否知道Spring Boot自動(dòng)化配置是怎么實(shí)現(xiàn)的呢尔当?

<a name="iM87x"></a>

## 一 初識(shí)自動(dòng)化配置

Spring Boot自動(dòng)化配置依賴于@EnableAutoConfiguration注解<br />該注解會(huì)在@SpringBootApplication中包含<br />該注解為一個(gè)復(fù)合注解包含了以下注解<br />@SpringBootConfiguration 標(biāo)識(shí)該類是一個(gè)配置類<br />@EnableAutoConfiguration 開啟自動(dòng)化配置<br />@ComponentScan 掃描該類下的所有包配置的bean<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/1751881/1605766349305-e5b2ae88-5100-4f06-9012-359fb970484b.png#align=left&display=inline&height=233&margin=%5Bobject%20Object%5D&name=image.png&originHeight=466&originWidth=916&size=60525&status=done&style=none&width=458)

<a name="TI8GH"></a>

## 二 揭開自動(dòng)化配置面紗

**@EnableAutoConfiguratio**n 今天我們主要關(guān)注的是這個(gè)注解 <br />此注解為一個(gè)復(fù)合注解包含了<br />**@AutoConfigurationPackage **<br />該注解會(huì)導(dǎo)入一個(gè)**AutoConfigurationPackages**類<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/1751881/1605774036383-146af0c9-a623-4b10-8b73-07c4b649c5b4.png#align=left&display=inline&height=227&margin=%5Bobject%20Object%5D&name=image.png&originHeight=454&originWidth=1019&size=50537&status=done&style=none&width=509.5)<br />**該方法****將主程序類所在包及所有子包下的組件到掃描到spring容器中完成****項(xiàng)目包下組件的自動(dòng)注冊(cè)**

> **至此我們完成了自動(dòng)化配置中自己的組件的自動(dòng)化配置,那么我們依賴的jar包自動(dòng)化配置說怎么實(shí)現(xiàn)的呢霞怀,請(qǐng)繼續(xù)往下看**

![image.png](https://cdn.nlark.com/yuque/0/2020/png/1751881/1605775088571-79912d2c-5d1d-4d65-969c-85d29fdbf315.png#align=left&display=inline&height=299&margin=%5Bobject%20Object%5D&name=image.png&originHeight=598&originWidth=1814&size=127855&status=done&style=none&width=907)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/1751881/1605775171339-f9ee7973-5264-4bcc-9296-d6dfcf93d278.png#align=left&display=inline&height=284&margin=%5Bobject%20Object%5D&name=image.png&originHeight=568&originWidth=1003&size=78791&status=done&style=none&width=501.5)

<a name="mz1Pw"></a>

## 三 深入自動(dòng)化配置

**我們繼續(xù)回到****EnableAutoConfiguration****注解 **<br />**![image.png](https://cdn.nlark.com/yuque/0/2020/png/1751881/1605777120808-058819b5-b772-4c66-a500-640a2bb839da.png#align=left&display=inline&height=374&margin=%5Bobject%20Object%5D&name=image.png&originHeight=749&originWidth=733&size=64165&status=done&style=none&width=366.5)**

<a name="iHhrI"></a>

### 該注解包含2個(gè)屬性:

exclude:根據(jù)類排除不使用的自動(dòng)配置欢嘿;<br />excludeName:根據(jù)類名排除不使用的自動(dòng)配置;<br />并導(dǎo)入了**AutoConfigurationImportSelector**類 該類的核心方法為**getCandidateConfigurations**通過該方法即可獲取到(spring-boot-2.1.3.RELEASE.jar/META-INF/spring.factories) 下的配置文件揩局,該文件為spring boot自動(dòng)化配置的配置文件毫玖,至此我們獲取到的是所有的自動(dòng)化配置類,那么spring boot的按需導(dǎo)入是怎么實(shí)現(xiàn)的呢凌盯,請(qǐng)繼續(xù)往下看<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/1751881/1605776345938-dfe94697-90f9-4c97-97d9-c557f5ca3a1f.png#align=left&display=inline&height=328&margin=%5Bobject%20Object%5D&name=image.png&originHeight=655&originWidth=1284&size=93261&status=done&style=none&width=642)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/1751881/1605776688829-6f621201-ffda-419d-bb1c-f36d6d314ee3.png#align=left&display=inline&height=424&margin=%5Bobject%20Object%5D&name=image.png&originHeight=848&originWidth=1668&size=180815&status=done&style=none&width=834)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/1751881/1605776722465-56b97643-9223-4bcc-b05c-d4a40031ec43.png#align=left&display=inline&height=437&margin=%5Bobject%20Object%5D&name=image.png&originHeight=873&originWidth=1573&size=201935&status=done&style=none&width=786.5)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/1751881/1605777393268-9c7a8c52-9e1e-4665-999a-44a68b5bffff.png#align=left&display=inline&height=239&margin=%5Bobject%20Object%5D&name=image.png&originHeight=478&originWidth=1038&size=95520&status=done&style=none&width=519)<br /><br />因?yàn)閟pring boot是按需配置所以我們還需要根據(jù)引入的依賴篩選出需要的配置付枫,核心方法如下

```java

protected AutoConfigurationEntry getAutoConfigurationEntry(

AutoConfigurationMetadata autoConfigurationMetadata,

AnnotationMetadata annotationMetadata) {

? ? ? ? //判斷是否開啟自動(dòng)配置

if (!isEnabled(annotationMetadata)) {

return EMPTY_ENTRY;

}

AnnotationAttributes attributes = getAttributes(annotationMetadata);

? ? ? //獲取自動(dòng)配置文件和配置

List<String> configurations = getCandidateConfigurations(annotationMetadata,

attributes);

? ? ? ? //刪除重復(fù)項(xiàng)

configurations = removeDuplicates(configurations);

? ? ? ? //獲取排除的自動(dòng)化配置

Set<String> exclusions = getExclusions(annotationMetadata, attributes);

? ? ? ? //檢查排除的自動(dòng)化配置

checkExcludedClasses(configurations, exclusions);

? ? ? //移除排除的自動(dòng)化配置

configurations.removeAll(exclusions);

? ? ? //根據(jù)引入的依賴按需導(dǎo)入自動(dòng)配置

configurations = filter(configurations, autoConfigurationMetadata);

? ? ? ? //觸發(fā)自動(dòng)化配置

fireAutoConfigurationImportEvents(configurations, exclusions);

return new AutoConfigurationEntry(configurations, exclusions);

}

```

filter方法會(huì)過濾我們的自動(dòng)化配置類 ,規(guī)則是根據(jù)我們配置類上的? @Conditiona系列注解<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/1751881/1605779980417-f5d8e3cc-3a9e-4dac-bc3e-328d40b8b9eb.png#align=left&display=inline&height=246&margin=%5Bobject%20Object%5D&name=image.png&originHeight=491&originWidth=1254&size=80896&status=done&style=none&width=627)

> @Conditiona系列注解含義驰怎,將在明天給大家講解,明天會(huì)做一個(gè)自動(dòng)配置的例子 希望大家關(guān)注一下

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末阐滩,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子县忌,更是在濱河造成了極大的恐慌掂榔,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件症杏,死亡現(xiàn)場(chǎng)離奇詭異衅疙,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)鸳慈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門饱溢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人走芋,你說我怎么就攤上這事绩郎。” “怎么了翁逞?”我有些...
    開封第一講書人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵肋杖,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我挖函,道長(zhǎng)状植,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任怨喘,我火速辦了婚禮津畸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘必怜。我一直安慰自己肉拓,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開白布梳庆。 她就那樣靜靜地躺著暖途,像睡著了一般卑惜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上驻售,一...
    開封第一講書人閱讀 51,590評(píng)論 1 305
  • 那天露久,我揣著相機(jī)與錄音廉赔,去河邊找鬼哪审。 笑死,一個(gè)胖子當(dāng)著我的面吹牛菜皂,可吹牛的內(nèi)容都是我干的纸巷。 我是一名探鬼主播镇草,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼瘤旨!你這毒婦竟也來了梯啤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤存哲,失蹤者是張志新(化名)和其女友劉穎因宇,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體祟偷,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡察滑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了修肠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贺辰。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖嵌施,靈堂內(nèi)的尸體忽然破棺而出饲化,到底是詐尸還是另有隱情,我是刑警寧澤吗伤,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布吃靠,位于F島的核電站,受9級(jí)特大地震影響足淆,放射性物質(zhì)發(fā)生泄漏巢块。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一巧号、第九天 我趴在偏房一處隱蔽的房頂上張望族奢。 院中可真熱鬧,春花似錦裂逐、人聲如沸歹鱼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)弥姻。三九已至,卻和暖如春掺涛,著一層夾襖步出監(jiān)牢的瞬間庭敦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工薪缆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留秧廉,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓拣帽,卻偏偏與公主長(zhǎng)得像疼电,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子减拭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

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