有什么区别:
new
创建的 RestTemplate:var t = new RestTemplate();
@Autowired
RestTemplateBuilder builder;
...
public void xyz() {
var t = builder.build();
}
var t = new RestTemplateBuilder().build();
根据 Spring 文档:
Spring Boot 不提供任何单个自动配置的 RestTemplate bean。但是,它会自动配置 RestTemplateBuilder,可用于在需要时创建 RestTemplate 实例。 自动配置的 RestTemplateBuilder 确保将合理的 HttpMessageConverters 和适当的 ClientHttpRequestFactory 应用于 RestTemplate 实例。
但是额外添加的
HttpMessageConverters
是什么呢?
#1 和 #2 应该以完全相同的配置返回 RestTemplate
吗?
#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
实例并最终配置构建器上设置的内容,因此它们或多或少是相同的。