SpringBoot-04-自動(dòng)配置原理再理解

4. 自動(dòng)配置原理再理解

? 配置文件到底能寫什么橘蜜?怎么寫犯犁?SpringBoot官方文檔有大量的配置醉顽,但是難以全部記住烦却。

在這里插入圖片描述

分析自動(dòng)配置原理

? 官方文檔

? 我們以HttpEncodingAutoConfiguration(Http編碼自動(dòng)配置)為例解釋自動(dòng)配置原理沙绝;

//表示這是一個(gè)配置類恶复,和以前編寫的配置文件一樣,也可以給容器中添加組件;
@Configuration 

//啟動(dòng)指定類的ConfigurationProperties功能朽色;
  //進(jìn)入這個(gè)HttpProperties查看,將配置文件中對(duì)應(yīng)的值和HttpProperties綁定起來组题;
  //并把HttpProperties加入到ioc容器中
@EnableConfigurationProperties({HttpProperties.class}) 

//Spring底層@Conditional注解
  //根據(jù)不同的條件判斷葫男,如果滿足指定的條件,整個(gè)配置類里面的配置就會(huì)生效崔列;
  //這里的意思就是判斷當(dāng)前應(yīng)用是否是web應(yīng)用梢褐,如果是,當(dāng)前配置類生效
@ConditionalOnWebApplication(
    type = Type.SERVLET
)

//判斷當(dāng)前項(xiàng)目有沒有這個(gè)類CharacterEncodingFilter赵讯;SpringMVC中進(jìn)行亂碼解決的過濾器盈咳;
@ConditionalOnClass({CharacterEncodingFilter.class})

//判斷配置文件中是否存在某個(gè)配置:spring.http.encoding.enabled;
  //如果不存在边翼,判斷也是成立的
  //即使我們配置文件中不配置pring.http.encoding.enabled=true鱼响,也是默認(rèn)生效的;
@ConditionalOnProperty(
    prefix = "spring.http.encoding",
    value = {"enabled"},
    matchIfMissing = true
)

public class HttpEncodingAutoConfiguration {
    //他已經(jīng)和SpringBoot的配置文件映射了
    private final Encoding properties;
    //只有一個(gè)有參構(gòu)造器的情況下组底,參數(shù)的值就會(huì)從容器中拿
    public HttpEncodingAutoConfiguration(HttpProperties properties) {
        this.properties = properties.getEncoding();
    }
    
    //給容器中添加一個(gè)組件丈积,這個(gè)組件的某些值需要從properties中獲取
    @Bean
    @ConditionalOnMissingBean //判斷容器沒有這個(gè)組件?
    public CharacterEncodingFilter characterEncodingFilter() {
        CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
        filter.setEncoding(this.properties.getCharset().name());
        filter.setForceRequestEncoding(this.properties.shouldForce(org.springframework.boot.autoconfigure.http.HttpProperties.Encoding.Type.REQUEST));
        filter.setForceResponseEncoding(this.properties.shouldForce(org.springframework.boot.autoconfigure.http.HttpProperties.Encoding.Type.RESPONSE));
        return filter;
    }
    
}

一句話總結(jié):

? 根據(jù)當(dāng)前不同的條件判斷斤寇,決定這個(gè)配置類是否生效桶癣!

  • 一旦配置類生效,它就會(huì)給容器中添加各種組件娘锁;
  • 這些組件的屬性是從對(duì)應(yīng)的properties類中獲取的牙寞,且每個(gè)屬性又和配置文件綁定;
  • 所有在配置文件中能配置的屬性都是xxxxProperties類中封裝著
  • 配置文件能配置什么就參考某個(gè)功能對(duì)應(yīng)的這個(gè)屬性類间雀;

精髓

  1. SpringBoot啟動(dòng)會(huì)加載大量的自動(dòng)配置類:xxxProperties
  2. 看我們需要的功能有沒有在SpringBoot默認(rèn)寫好的自動(dòng)配置類中悔详;
  3. 再看這個(gè)自動(dòng)配置類中到底配置了哪些組件(只要我們用的組件存在其中,那么就不需要手動(dòng)配置)惹挟;
  4. 給容器中的自動(dòng)配置類添加組件的時(shí)候茄螃,會(huì)從properties類中獲取某些屬性(我們可以在配置文件中指定);

xxxxAutoConfiguration:自動(dòng)配置類 连锯;給容器添加組件

xxxxProperties:封裝配置文件中相關(guān)屬性

了解:@Conditional

我們了解了 自動(dòng)配置類必須在一定條件下才能生效归苍!

@Conditional派生注解

作用:必須是@Conditional指定的條件成立,才會(huì)給容器添加組件运怖,配置配里面的所有內(nèi)容才會(huì)生效拼弃!

在這里插入圖片描述

我們?cè)趺粗滥男┳詣?dòng)配置類生效了呢?

啟動(dòng)debug=true屬性摇展;來讓控制臺(tái)打印自動(dòng)配置報(bào)告

# 開啟springboot的調(diào)試類
debug=true

Positive matches:(自動(dòng)配置類啟動(dòng)的:正匹配)

Negative matches:(沒有匹配成功的:負(fù)匹配)

Unconditional classes:(沒有條件的類)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末吻氧,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子咏连,更是在濱河造成了極大的恐慌盯孙,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件祟滴,死亡現(xiàn)場(chǎng)離奇詭異振惰,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)踱启,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門报账,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人埠偿,你說我怎么就攤上這事“窕蓿” “怎么了冠蒋?”我有些...
    開封第一講書人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長乾胶。 經(jīng)常有香客問我抖剿,道長,這世上最難降的妖魔是什么识窿? 我笑而不...
    開封第一講書人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任斩郎,我火速辦了婚禮,結(jié)果婚禮上喻频,老公的妹妹穿的比我還像新娘缩宜。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開白布锻煌。 她就那樣靜靜地躺著妓布,像睡著了一般。 火紅的嫁衣襯著肌膚如雪宋梧。 梳的紋絲不亂的頭發(fā)上匣沼,一...
    開封第一講書人閱讀 51,482評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音捂龄,去河邊找鬼释涛。 笑死,一個(gè)胖子當(dāng)著我的面吹牛倦沧,可吹牛的內(nèi)容都是我干的唇撬。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼刀脏,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼局荚!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起愈污,我...
    開封第一講書人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤耀态,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后暂雹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體首装,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年杭跪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了仙逻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡涧尿,死狀恐怖系奉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情姑廉,我是刑警寧澤缺亮,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站桥言,受9級(jí)特大地震影響萌踱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜号阿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一并鸵、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧扔涧,春花似錦园担、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽疼约。三九已至,卻和暖如春蝙泼,著一層夾襖步出監(jiān)牢的瞬間程剥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來泰國打工汤踏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留织鲸,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓溪胶,卻偏偏與公主長得像搂擦,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子哗脖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354