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; ...... } }

 

posted @ 2021-10-10 17:31  有梦想的肥宅  阅读(277)  评论(0编辑  收藏  举报