zoukankan      html  css  js  c++  java
  • 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; ...... } }
  • 相关阅读:
    关于使用css3属性:transform固定菜单位置,在滑动页面时菜单闪现抖动的问题
    使用iscroll.js插件时,遇到在Android端无法点击a超链的解决办法
    window.external的使用
    SpringMVC的拦截器(Interceptor)和过滤器(Filter)的区别与联系
    chain.doFilter(request,response)含义
    巧用Ajax的beforeSend 提高用户体验
    getRequestDispatcher(path).forward(),,执行完,后面的代码居然还会执行!!!记得加return 啊亲
    @JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
    ajax修改表单的值后dom没更新的解决办法
    .net core json序列化首字符小写和日期格式处理
  • 原文地址:https://www.cnblogs.com/riches/p/15389958.html
Copyright © 2011-2022 走看看