天天看點

SpringBoot的自動加載源碼分析

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

繼續閱讀