SpringBoot-04-自動配置原理再理解

CodeHuba發表於2020-10-03

4. 自動配置原理再理解

​ 配置檔案到底能寫什麼?怎麼寫?SpringBoot官方文件有大量的配置,但是難以全部記住。

在這裡插入圖片描述

分析自動配置原理

官方文件

​ 我們以HttpEncodingAutoConfiguration(Http編碼自動配置)為例解釋自動配置原理;

//表示這是一個配置類,和以前編寫的配置檔案一樣,也可以給容器中新增元件;
@Configuration 

//啟動指定類的ConfigurationProperties功能;
  //進入這個HttpProperties檢視,將配置檔案中對應的值和HttpProperties繫結起來;
  //並把HttpProperties加入到ioc容器中
@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類中獲取的,且每個屬性又和配置檔案繫結;
  • 所有在配置檔案中能配置的屬性都是xxxxProperties類中封裝著
  • 配置檔案能配置什麼就參考某個功能對應的這個屬性類;

精髓

  1. SpringBoot啟動會載入大量的自動配置類:xxxProperties
  2. 看我們需要的功能有沒有在SpringBoot預設寫好的自動配置類中;
  3. 再看這個自動配置類中到底配置了哪些元件(只要我們用的元件存在其中,那麼就不需要手動配置);
  4. 給容器中的自動配置類新增元件的時候,會從properties類中獲取某些屬性(我們可以在配置檔案中指定);

xxxxAutoConfiguration:自動配置類 ;給容器新增元件

xxxxProperties:封裝配置檔案中相關屬性

瞭解:@Conditional

我們瞭解了 自動配置類必須在一定條件下才能生效!

@Conditional派生註解

作用:必須是@Conditional指定的條件成立,才會給容器新增元件,配置配裡面的所有內容才會生效!

在這裡插入圖片描述

我們怎麼知道哪些自動配置類生效了呢?

啟動debug=true屬性;來讓控制檯列印自動配置報告

# 開啟springboot的除錯類
debug=true

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

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

Unconditional classes:(沒有條件的類)

相關文章