SpringBoot的自動加載舉例。
使用HttpEncodingAutoConfiguration舉例
我們從/Users/apple/Documents/Work/.m2/repository/org/springframework/boot/spring-boot-autoconfigure/2.1.9.RELEASE/spring-boot-autoconfigure-2.1.9.RELEASE.jar!/META-INF/spring.factories檔案中的HttpEncodingAutoConfiguration開始分析。
/**
* @Configuration注解的作用有2個。
* 1、表明這是一個配置類
* 2、可以給容器中添加元件,類似@Service等Ioc注解的作用
* 這裡表明這個類是一個配置類,而且吧配置類注入到Spring容器中
*/
@Configuration
/**
* @EnableConfigurationProperties注解的作用
* 1、啟用ConfigurationProperties功能。具體到這裡就是啟用HttpProperties
* 2、吧HttpProperties.class也注入到了Spring的容器中(實作了JavaBean與yaml配置檔案屬性的關聯)
*/
@EnableConfigurationProperties(HttpProperties.class)
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
/**
* @ConditionOnXxx類注解的作用
* 1、均表示根據一定的條件來決定是否注入到Spring容器中,這些Condition是前提,隻有這些滿足,才會建立HttpEncodingAutoConfiguration。
*/
@ConditionalOnClass(CharacterEncodingFilter.class)
@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)
public class HttpEncodingAutoConfiguration {
HttpProperties是否會被Spring建立,取決于有沒有@EnableConfigurationProperties來關聯啟用它。
/**
* @ConfigurationProperties注解的作用
* 1、用來進行屬性綁定的。
* 這裡是:HttpProperties類的屬性就被綁定到了以spring.http開頭的配置檔案中(如yaml檔案)
* 備注:
* 這個類是否會被注入到Spring容器中,取決與有沒有@EnableConfigurationProperties來讓它啟用。
*/
@ConfigurationProperties(prefix = "spring.http")
public class HttpProperties {
以上的分析解決了HttpProperties最終會根據一定的條件是否建立的過程,但是并沒有解決yaml檔案配置的屬性是怎麼注入到了HttpProperties的問題。以下分析一下這個問題。
yaml檔案與配置類HttpProperties的關聯是通過@ConfigurationProperties注解的prefix來綁定的。看下圖
@ConfigurationProperties(prefix = "acme", ignoreUnknownFields = true)
@Data
public class AcmeProperties {
private String username;
}
//application.yaml檔案
acme:
username: yuchangyuan
可以看到配置類的prefix="acme"與application.yaml的acme關聯起來了,配置類的屬性(這裡是username)與yaml檔案的username關聯起來了。這裡隻是拿String類型的username屬性舉了例子,其他如List、Map、對象等都可以與yaml檔案檔案關聯。具體可以參看下yaml的一些簡單描述:
https://www.runoob.com/w3cnote/yaml-intro.html