• 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; ...... } }
  • 相关阅读:
    浮于文字上方的图片如何设置居中
    grub4dos_BIOS和grub4dos_UEFI编译环境搭建(ubuntu14.04)
    微信小程序开发——开发小技巧集锦
    vue+Better-scroll实现滚动位置保持并对页面切换效果进行优化
    谈谈fork/join实现原理
    ES系列(七):多节点任务的高效分发与收集实现
    JVM系列(五):gc实现概要01
    谈谈stream的运行原理
    ES系列(六):search处理过程实现1框架
    ES系列(五):获取单条数据get处理过程实现
  • 原文地址:https://www.cnblogs.com/riches/p/15389958.html
Copyright © 2020-2023  润新知