1. 程式人生 > 其它 >Spring Boot原始碼(五)以HttpEncodingAutoConfiguration【Http 編碼自動配置】為例解釋自動配置原理

Spring Boot原始碼(五)以HttpEncodingAutoConfiguration【Http 編碼自動配置】為例解釋自動配置原理

一、前言

  前面學習了那麼多原始碼理論層面的知識,這篇我們就以HttpEncodingAutoConfiguration實戰分析一下自動配置的原理,話不多說,直接上程式碼和註釋。

二、程式碼解析

HttpEncodingAutoConfiguration

/**
 * HTTP請求編碼自動配置類【有夢想的肥宅】
 * 功能:解決中文亂碼問題
 */

//表示這是一個配置類,會被掃描載入到IOC容器中
@Configuration(proxyBeanMethods = false)

//表示啟動指定類的ConfigurationProperties功能,將配置檔案中對應的值和HttpProperties繫結起來
@EnableConfigurationProperties(HttpProperties.class) //判斷當前應用是否是web應用,如果是則當前配置類生效 @ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET) //判斷當前專案有沒有CharacterEncodingFilter【SpringMVC中進行亂碼解決的過濾器】 @ConditionalOnClass(CharacterEncodingFilter.class) //判斷配置檔案中是否存在某個配置spring.http.encoding.enabled
//matchIfMissing = true 表示即使我們配置檔案中不配置spring.http.encoding.enabled=true,也是預設生效的 @ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true) public class HttpEncodingAutoConfiguration { //HttpProperties物件已經通過@ConfigurationProperties(prefix = "spring.http")和配置檔案進行屬性映射了
private final HttpProperties.Encoding properties; //PS:這種寫法表示只有一個有參構造器的情況下,引數的值就會從容器中拿 public HttpEncodingAutoConfiguration(HttpProperties properties) { this.properties = properties.getEncoding(); } @Bean //給容器中新增一個元件【型別為方法返回值型別】,這個元件中的某些值需要從properties中獲取 @ConditionalOnMissingBean //當IOC容器中沒有這個Bean時才會生成此物件並放入IOC容器中 public CharacterEncodingFilter characterEncodingFilter() { CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter(); filter.setEncoding(this.properties.getCharset().name()); filter.setForceRequestEncoding(this.properties.shouldForce(Type.REQUEST)); filter.setForceResponseEncoding(this.properties.shouldForce(Type.RESPONSE)); return filter; }
......
}

HttpProperties

/**
 * HTTP屬性對映類【有夢想的肥宅】
 *
 * 功能:我們能配置的屬性都是來源於這個功能的properties類
 * 可配置的專案如下:
 *
 * spring.http.encoding.enabled=true
 * spring.http.encoding.charset=utf-8
 * spring.http.encoding.force=true
 */
//從配置檔案中獲取指定的值和bean的屬性進行繫結
@ConfigurationProperties(prefix = "spring.http")
public class HttpProperties {

  ....../**
     * HTTP encoding 配置
     */
    private final Encoding encoding = new Encoding();

  ......

    /**
     * http encoding 具體屬性配置類
     */
    public static class Encoding {

     ......
public static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8; private Charset charset = DEFAULT_CHARSET; private Boolean force; private Boolean forceRequest; private Boolean forceResponse; private Map<Locale, Charset> mapping; ...... } }