手动创建的RestTemplate、新建的RestTemplateBuilder和自动配置的RestTemplateBuilder之间的区别

问题描述 投票:0回答:1

有什么区别:

  1. 使用
    new
    创建的 RestTemplate:

var t = new RestTemplate();

  1. 使用自动配置的 RestTemplateBuilder 创建的 RestTemplate
@Autowired
RestTemplateBuilder builder;

...
public void xyz() {
  var t = builder.build();
}
  1. 从新的 RestTemplateBuilder 创建的 RestTemplate:

var t = new RestTemplateBuilder().build();

根据 Spring 文档

Spring Boot 不提供任何单个自动配置的 RestTemplate bean。但是,它会自动配置 RestTemplateBuilder,可用于在需要时创建 RestTemplate 实例。 自动配置的 RestTemplateBuilder 确保将合理的 HttpMessageConverters 和适当的 ClientHttpRequestFactory 应用于 RestTemplate 实例。

但是额外添加的

HttpMessageConverters
是什么呢? #1 和 #2 应该以完全相同的配置返回
RestTemplate
吗?

spring spring-boot spring-mvc
1个回答
0
投票

TL;博士

#1 和 #2 不一样,因为 2 为您预先配置了额外的部分。 #1 和 #3 接近相同,但 #3 有一些不同的配置。

长答案

查看差异的最佳方法是直接查看自动配置的代码。 这里是自动配置代码的链接,我将在下面复制它。

@AutoConfiguration(after = HttpMessageConvertersAutoConfiguration.class)
@ConditionalOnClass(RestTemplate.class)
@Conditional(NotReactiveWebApplicationCondition.class)
public class RestTemplateAutoConfiguration {

    @Bean
    @Lazy
    public RestTemplateBuilderConfigurer restTemplateBuilderConfigurer(
            ObjectProvider<HttpMessageConverters> messageConverters,
            ObjectProvider<RestTemplateCustomizer> restTemplateCustomizers,
            ObjectProvider<RestTemplateRequestCustomizer<?>> restTemplateRequestCustomizers) {
        RestTemplateBuilderConfigurer configurer = new RestTemplateBuilderConfigurer();
        configurer.setHttpMessageConverters(messageConverters.getIfUnique());
        configurer.setRestTemplateCustomizers(restTemplateCustomizers.orderedStream().toList());
        configurer.setRestTemplateRequestCustomizers(restTemplateRequestCustomizers.orderedStream().toList());
        return configurer;
    }

    @Bean
    @Lazy
    @ConditionalOnMissingBean
    public RestTemplateBuilder restTemplateBuilder(RestTemplateBuilderConfigurer restTemplateBuilderConfigurer) {
        RestTemplateBuilder builder = new RestTemplateBuilder();
        return restTemplateBuilderConfigurer.configure(builder);
    }

}

如您所见,它只是创建

RestTemplateBuilder
的新实例,并使用配置的定制器(包括
HttpMessageConverters
RestTemplateCustomizers
RestTemplateRequestCustomizers
)调用配置方法。

至于新的

RestTemplate
RestTemplateBuilder
之间的区别,如果你看一下
build
RestTemplateBuilder
方法(链接这里)它只是创建一个新的
RestTemplate
实例并最终配置构建器上设置的内容,因此它们或多或少是相同的。

© www.soinside.com 2019 - 2024. All rights reserved.