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; ...... } }
分类:
【阿肥的架构师之路】
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
2019-10-10 MyBatis学习(二)代码实战