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è)屬性類间雀;
精髓
- SpringBoot啟動(dòng)會(huì)加載大量的自動(dòng)配置類:
xxxProperties
- 看我們需要的功能有沒有在SpringBoot默認(rèn)寫好的自動(dòng)配置類中悔详;
- 再看這個(gè)自動(dòng)配置類中到底配置了哪些組件(只要我們用的組件存在其中,那么就不需要手動(dòng)配置)惹挟;
- 給容器中的自動(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:(沒有條件的類)