狂神-SpringBoot筆記目錄
文章目錄
- 七、自動配置原理【重點】
- 7.1分析自動配置原理
- 7.2精髓
- 7.3了解:@Conditional
七、自動配置原理【重點】
- 配置檔案到底能寫什麼?怎麼寫?
- SpringBoot官方文檔中有大量的配置,我們無法全部記住
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiATN381dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cGcq5SM4YjNxUjYjRTO1AzYkJ2YyYzXxATNxYTMxEzLcdDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.jpg)
7.1分析自動配置原理
從spring.factories中選擇一個類進入,我們以HttpEncodingAutoConfiguration(Http編碼自動配置) 為例解釋自動配置原理;
//表示這是一個配置類,和以前編寫的配置檔案一樣,也可以給容器中添加元件;
@Configuration
//啟動指定類的ConfigurationProperties功能; (HttpProperties.class 這個就是自動配置類)
//進入這個HttpProperties檢視,将配置檔案中對應的值和HttpProperties綁定起來;
//并把HttpProperties加入到ioc容器中
//自動裝配屬性,裝配好之後,HttpProperties.class這個裡面的屬性(要加上這個類注解綁定的字首)就是我們在application.yaml配置檔案中配置的鍵(key)
@EnableConfigurationProperties({HttpProperties.class})
//Spring底層@Conditional注解
//根據不同的條件判斷來判斷目前配置或類是否生效,如果滿足指定的條件,整個配置類裡面的配置就會生效;
//這裡的意思就是判斷目前應用是否是web應用,如果是,目前配置類生效
@ConditionalOnWebApplication(
type = Type.SERVLET
)
//判斷目前項目有沒有這個類CharacterEncodingFilter;SpringMVC中進行亂碼解決的過濾器;
@ConditionalOnClass({CharacterEncodingFilter.class})
//判斷配置檔案中是否存在某個配置:spring.http.encoding.enabled;
//如果不存在,判斷也是成立的
//即使我們配置檔案中不配置pring.http.encoding.enabled=true,也是預設生效的;
@ConditionalOnProperty(
prefix = "spring.http.encoding",
value = {"enabled"},
matchIfMissing = true
)
public class HttpEncodingAutoConfiguration {
//他已經和SpringBoot的配置檔案映射了
private final Encoding properties;
//隻有一個有參構造器的情況下,參數的值就會從容器中拿
public HttpEncodingAutoConfiguration(HttpProperties properties) {
this.properties = properties.getEncoding();
}
//給容器中添加一個元件,這個元件的某些值需要從properties中擷取
@Bean
@ConditionalOnMissingBean //判斷容器沒有這個元件?
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;
}
//..........
}
一句話總結 :根據目前不同的條件判斷,決定這個配置類是否生效!
- 一但這個配置類生效;這個配置類就會給容器中添加各種元件;
- 這些元件的屬性是從對應的properties類中擷取的,這些類裡面的每一個屬性又是和配置檔案(application.yaml)綁定的;
- 所有在配置檔案中能配置的屬性都是在xxxxProperties類中封裝着;
- 配置檔案能配置什麼就可以參照某個功能對應的這個屬性類
//從配置檔案中擷取指定的值和bean的屬性進行綁定
@ConfigurationProperties(prefix = "spring.http")
public class HttpProperties {
// 衆多屬性.....
}
我們去配置檔案裡面試試字首,看提示!
這就是自動裝配的原理!
7.2精髓
1、SpringBoot啟動會加載大量的自動配置類(xxxxAutoConfigurartion),每一個自動配置類中都有對應的 xxxxProperties,這些xxxxProperties中有着相關的屬性與預設值,這些屬性又是和配置檔案(application.yaml)綁定的,是以我們可以通過配置檔案來修改SpringBoot自動配置的預設值;
2、我們看我們需要的功能有沒有在SpringBoot預設寫好的自動配置類當中;
3、我們再來看這個自動配置類中到底配置了哪些元件;(隻要我們要用的元件存在在其中,我們就不需要再手動配置了)
4、給容器中自動配置類添加元件的時候,會從properties類中擷取某些屬性。我們隻需要在配置檔案(application.yaml)中指定這些屬性的值即可;
xxxxAutoConfigurartion: 給容器中添加元件
xxxxProperties:封裝配置檔案中相關屬性; 自動配置類
7.3了解:@Conditional
了解完自動裝配的原理後,我們來關注一個細節問題,自動配置類必須在一定的條件下才能生效;
@Conditional派生注解(Spring注解版原生的@Conditional作用)
作用:必須是@Conditional指定的條件成立,才給容器中添加元件,配置配裡面的所有内容才生效;
那麼多的自動配置類,必須在一定的條件下才能生效;也就是說,我們加載了這麼多的配置類,但不是所有的都生效了。
我們怎麼知道哪些自動配置類生效?
#開啟springboot的調試類
debug=true
- Positive matches:(自動配置類啟用的:正比對) 已經啟用了,并且生效的
- Negative matches:(沒有啟動,沒有比對成功的自動配置類:負比對)
- Unconditional classes: (沒有條件的類)