1. 程式人生 > 其它 >SpringBoot-自動裝配2

SpringBoot-自動裝配2

配置檔案到底能寫什麼?怎麼寫?

SpringBoot官方文件中有大量的配置,直接去記憶的話,好像不是我們程式設計師的行事風格!

分析自動配置原理

能自動配置的元件一般都有命名為下面規則的兩個類:

xxxxAutoConfigurartion:自動配置類;

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

我們以HttpEncodingAutoConfiguration(Http編碼自動配置)為例來理解自動配置原理:


@Configuration(
proxyBeanMethods = false
)
@EnableConfigurationProperties({ServerProperties.class})

@ConditionalOnWebApplication(
type = Type.SERVLET
)
@ConditionalOnClass({CharacterEncodingFilter.class})
@ConditionalOnProperty(
prefix = "server.servlet.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; } //...... }

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

@EnableConfigurationProperties({HttpProperties.class})

啟動指定類的ConfigurationProperties功能;
進入這個HttpProperties檢視,將配置檔案中對應的值和HttpProperties繫結起來;

並把HttpProperties加入到ioc容器中


@ConditionalOnWebApplication(
type = Type.SERVLET
)
Spring底層@Conditional註解
根據不同的條件判斷,如果滿足指定的條件,整個配置類裡面的配置就會生效
這裡的意思就是判斷當前應用是否是web應用,如果是,當前配置類生效

@ConditionalOnClass({CharacterEncodingFilter.class})
判斷當前專案有沒有這個類CharacterEncodingFilter;SpringMVC中進行亂碼解決的過濾器

@ConditionalOnProperty(

prefix = "spring.http.encoding", value = {"enabled"}, matchIfMissing = true


判斷配置檔案中是否存在某個配置:spring.http.encoding.enabled
如果不存在,判斷也是成立的
即使我們配置檔案中不配置pring.http.encoding.enabled=true,也是預設生效的

總結就是 :根據當前不同的條件判斷,決定這個配置類是否生效!

  • 一但這個配置類生效;這個配置類就會給容器中新增各種元件;

  • 這些元件的屬性是從對應的properties類中獲取的,這些類裡面的每一個屬性又是和配置檔案繫結的;

  • 所有在配置檔案中能配置的屬性都是在xxxxProperties類中封裝著;

  • 配置檔案能配置什麼就可以參照某個功能對應的這個屬性類

至於配配置什麼,可從xxxxProperties類看:

//從配置檔案中獲取指定的值和bean的屬性進行繫結
@ConfigurationProperties(prefix = "spring.http") 
public class HttpProperties {
    // .....
}

例如上門的例子,去配置檔案裡面試試字首,看提示!

這就是自動裝配的原理!

精髓

1、SpringBoot啟動會載入大量的自動配置類

2、我們看我們需要的功能有沒有在SpringBoot預設寫好的自動配置類當中;

3、我們再來看這個自動配置類中到底配置了哪些元件;(只要我們要用的元件存在在其中,我們就不需要再手動配置了)

4、給容器中自動配置類新增元件的時候,會從properties類中獲取某些屬性。我們只需要在配置檔案中指定這些屬性的值即可

瞭解:@Conditional

瞭解完自動裝配的原理後,我們來關注一個細節問題,自動配置類必須在一定的條件下才能生效;

@Conditional派生註解

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

那麼多的自動配置類,必須在一定的條件下才能生效;也就是說,我們載入了這麼多的配置類,但不是所有的都生效了。

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

我們可以通過啟用 debug=true屬性;來讓控制檯列印自動配置報告,這樣我們就可以很方便的知道哪些自動配置類生效;

#開啟springboot的除錯類debug=true

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

Negative matches:(沒有啟動,沒有匹配成功的自動配置類:負匹配)

Unconditional classes: (沒有條件的類)

掌握吸收理解原理,即可以不變應萬變!