三种RestTemplate创建方式的差异及相关配置疑问
RestTemplate三种创建方式的区别及配置细节
一、三种创建方式的核心区别
- 方式1:直接new RestTemplate()
纯手动创建,Spring容器完全不参与配置,只遵循RestTemplate自身的默认构造逻辑初始化,仅包含基础的HttpMessageConverters和ClientHttpRequestFactory。 - 方式2:注入自动配置的RestTemplateBuilder构建
使用Spring Boot自动配置提供的RestTemplateBuilder实例,这个Builder已经被Spring预配置了一系列实用默认值:会根据类路径依赖自动选择合适的ClientHttpRequestFactory(比如有OkHttp依赖就用OkHttp3ClientHttpRequestFactory,否则用SimpleClientHttpRequestFactory),还支持通过spring.resttemplate.*配置文件自定义参数,同时会注册适配场景的HttpMessageConverters。 - 方式3:new RestTemplateBuilder()构建
手动创建的Builder没有Spring自动配置的加持,和直接new RestTemplate的逻辑差不多,只会用Builder自身的默认规则,不会加载配置文件的自定义设置,也不会自动适配类路径下的HTTP客户端依赖。
二、自动配置的RestTemplateBuilder添加的额外HttpMessageConverters
Spring Boot自动配置的RestTemplateBuilder会在RestTemplate默认转换器的基础上,根据类路径中的依赖自动添加以下常用转换器:
MappingJackson2HttpMessageConverter:类路径有Jackson依赖(spring-boot-starter-web默认包含)时,用于处理JSON格式的请求响应。MappingJackson2XmlHttpMessageConverter:类路径有Jackson XML扩展依赖时,处理XML格式。GsonHttpMessageConverter:类路径有Gson依赖时,作为JSON处理的备选方案。StringHttpMessageConverter:默认就存在,但自动配置会强制将字符集设为UTF-8(RestTemplate原生默认可能不是)。FormHttpMessageConverter:处理表单数据(application/x-www-form-urlencoded),自动配置会优化它的媒体类型支持范围。- 若存在JAXB依赖,还会添加
Jaxb2RootElementHttpMessageConverter来处理XML。
三、方式1与方式2创建的RestTemplate配置差异
两者配置完全不同,核心差异如下:
- HttpMessageConverters:方式1只有RestTemplate自带的基础转换器,不会自动注册Jackson、Gson等适配依赖的转换器;方式2会根据类路径依赖自动添加上述额外转换器,还会配置合理的默认参数(比如UTF-8字符集)。
- ClientHttpRequestFactory:方式1默认使用
SimpleClientHttpRequestFactory;方式2会自动检测类路径中的高性能HTTP客户端库(如OkHttp、Apache HttpClient),优先选用对应的Factory,没有的话才回退到SimpleClientHttpRequestFactory。 - 配置灵活性:方式2可以通过
spring.resttemplate.*配置项自定义超时、连接池等参数,还能通过自定义RestTemplateCustomizer实现全局定制;方式1只能手动修改实例参数,没法利用Spring的配置机制。 - 错误处理:自动配置的Builder会默认配置更实用的
ResponseErrorHandler,而方式1用的是原生默认的DefaultResponseErrorHandler,没有额外优化。
内容的提问来源于stack exchange,提问作者rnayabed
相关产品推荐
相关产品推荐

