概述
针对HttpMessageConverter
的自动配置类。HttpMessageConvertersAutoConfiguration
会综合考虑jackson
,gson
,jsonb
包的引用情况,以及配置项spring.http.converters.preferred-json-mapper
的使用情况决定引入相应的json HttpMessageConverter bean
,并定义一个StringHttpMessageConverter bean
,然后基于容器中所有的HttpMessageConverter bean
,定义一个HttpMessageConverters bean
(仅在该bean
为定义时定义它)。缺省情况下,HttpMessageConvertersAutoConfiguration
所定义的HttpMessageConverters bean
中通常包含两个HttpMessageConverter bean
:
MappingJackson2HttpMessageConverter bean
StringHttpMessageConverter bean
(缺省字符集UTF-8
)
源代码
源代码版本 : spring-boot-autoconfigure-2.1.3.RELEASE
package org.springframework.boot.autoconfigure.http;
// 省略 import 行
@Configuration
// 仅在类 HttpMessageConverter 存在于classpath 上时才生效
@ConditionalOnClass(HttpMessageConverter.class)
// 在指定自动配置类应用之后才应用
@AutoConfigureAfter({ GsonAutoConfiguration.class, JacksonAutoConfiguration.class,
JsonbAutoConfiguration.class })
// 导入其他配置类
// 1. JacksonHttpMessageConvertersConfiguration 定义 bean MappingJackson2HttpMessageConverter
// 1. 仅在该 bean 没有被定义的情况下才定义
// 2. 配置项 spring.http.converters.preferred-json-mapper 缺失或者值为 jackson 时生效
// 3. 如果类 XmlMapper 存在于 classpath,并且存在 bean Jackson2ObjectMapperBuilder,
// 也会在 bean MappingJackson2XmlHttpMessageConverter 不存在的情况下定义它
// 2. GsonHttpMessageConvertersConfiguration 定义 bean GsonHttpMessageConverter
// 1. 仅在 Gson 类存在于 classpath 的情况下才生效
// 2. 仅在该 bean 不存在的情况下才定义
// 3. 仅在 jackson 和 jsonb 都不可用,或者 spring.http.converters.preferred-json-mapper=gson
// 时生效
// 3. JsonbHttpMessageConvertersConfiguration 定义 bean JsonbHttpMessageConverter
// 在 Jsonb 包被使用前提下:
// 1. bean MappingJackson2HttpMessageConverter 和 bean GsonHttpMessageConverter 不存在时生效,
// 2. 或者 spring.http.converters.preferred-json-mapper=jsonb 时生效
@Import({ JacksonHttpMessageConvertersConfiguration.class,
GsonHttpMessageConvertersConfiguration.class,
JsonbHttpMessageConvertersConfiguration.class })
public class HttpMessageConvertersAutoConfiguration {
static final String PREFERRED_MAPPER_PROPERTY = "spring.http.converters.preferred-json-mapper";
private final List<HttpMessageConverter<?>> converters;
// JacksonHttpMessageConvertersConfiguration,GsonHttpMessageConvertersConfiguration,
// JsonbHttpMessageConvertersConfiguration , StringHttpMessageConverterConfiguration 定义
// 的 HttpMessageConverter bean, 或者通过其他途径定义的 HttpMessageConverter bean 会通过
// 该构造函数注入进来
public HttpMessageConvertersAutoConfiguration(
ObjectProvider<HttpMessageConverter<?>> convertersProvider) {
this.converters = convertersProvider.orderedStream().collect(Collectors.toList());
}
// 定义 bean HttpMessageConverters messageConverters
@Bean
// 如果容器中不存在该bean才定义该bean
@ConditionalOnMissingBean
public HttpMessageConverters messageConverters() {
return new HttpMessageConverters(this.converters);
}
// 嵌套配置类
@Configuration
// 仅在类 StringHttpMessageConverter 存在于 classpath 上时才生效
@ConditionalOnClass(StringHttpMessageConverter.class)
// 确保前缀为 spring.http 的配置项被加载到 bean HttpProperties 中
@EnableConfigurationProperties(HttpProperties.class)
protected static class StringHttpMessageConverterConfiguration {
private final HttpProperties.Encoding properties;
protected StringHttpMessageConverterConfiguration(HttpProperties httpProperties) {
this.properties = httpProperties.getEncoding();
}
// 定义 bean StringHttpMessageConverter stringHttpMessageConverter
@Bean
// 如果容器中不存在该bean才定义该bean
@ConditionalOnMissingBean
public StringHttpMessageConverter stringHttpMessageConverter() {
// 注意这里字符集使用配置项 spring.http.encoding.charset 所指定字符集,缺省为 UTF-8
StringHttpMessageConverter converter = new StringHttpMessageConverter(
this.properties.getCharset());
converter.setWriteAcceptCharset(false);
return converter;
}
}
}