Spring Boot 自动配置 : HttpMessageConvertersAutoConfiguration

概述

针对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;
		}

	}

}

参考文章

  • Spring : 概念模型接口 HttpMessageConverter
  • Spring MVC : 缺省使用的 HttpMessageConverter

你可能感兴趣的:(Spring,Boot,Spring,Boot,自动配置)