SpringBoot:自動裝配
阿新 • • 發佈:2021-01-29
技術標籤:Springspring boot
yaml注入配置檔案
原來實體是使用@value來注入的,現在用yaml配置的方式進行注入
/*
@ConfigurationProperties作用:
將配置檔案中配置的每一個屬性的值,對映到這個元件中;
告訴SpringBoot將本類中的所有屬性和配置檔案中相關的配置進行繫結
引數 prefix = “person” : 將配置檔案中的person下面的所有屬性一一對應
*/
@Component //註冊bean
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
}
載入指定的配置檔案
@PropertySource :載入指定的配置檔案;(還是要用@value)
@configurationProperties:預設從全域性配置檔案中獲取值;
分析自動配置原理
//表示這是一個配置類,和以前編寫的配置檔案一樣,也可以給容器中新增元件;
@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類中封裝著;
-
配置檔案能配置什麼就可以參照某個功能對應的這個屬性類
//從配置檔案中獲取指定的值和bean的屬性進行繫結
@ConfigurationProperties(prefix = "spring.http")
public class HttpProperties {
// .....
}
小結
1、SpringBoot啟動會載入大量的自動配置類
2、我們看我們需要的功能有沒有在SpringBoot預設寫好的自動配置類當中;
3、我們再來看這個自動配置類中到底配置了哪些元件;(只要我們要用的元件存在在其中,我們就不需要再手動配置了)
4、給容器中自動配置類新增元件的時候,會從properties類中獲取某些屬性。我們只需要在配置檔案中指定這些屬性的值即可;
在yml能配置的東西,一定有一個固有的規律:
xxxxAutoConfigurartion:自動配置類,幫我們自動裝配東西/給容器中新增元件;
xxxxProperties:封裝配置檔案中相關屬性,和配置檔案繫結;這樣我們就能用yml等自定義的配置。