我对 Java 比较陌生。我有一些代码可以做到这一点:
@Bean
public RestTemplate restTemplate()
{
return new RestTemplate(clientHttpRequestFactory());
}
@Bean
public ClientHttpRequestFactory clientHttpRequestFactory()
{
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient());
//some config...
return factory;
}
@Bean
public HttpClient httpClient()
{
//some config here too..
}
我不明白为什么RestTemplate
需要ClientHttpRequestFactory
来创建使用HttpClient
的HttpComponentsClientHttpRequestFactory
。文档只是说一个使用另一个但没有说明它们的作用?它们各自在“真实”世界(http
世界)中代表什么以及它们彼此有何特别之处?为什么我们需要它们相互包裹(例如为什么不创建 RestTemplate
并将其全部配置在它的类中)?
最佳答案
在 Spring 中,RestTemplate 是用于与 Http/REST url 通信的默认对象。
RestTemplate 默认使用基于 Java/JDK(内部)的 http 客户端(用于与 http 服务器通信的软件)。如果您想使用不同的 HTTP 客户端,如 Apache HttpComponents 、Netty 和 OkHttp您可以为 RestTemplate 对象提供不同的 ClientHttpRequestFactory 实例。您不必这样做,但您可以。
只需指定:
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
可能足以满足您的场景。如果您使用 Spring Boot,则已经可以使用剩余模板。您可以使用:
@Autorwired
private RestTemplate restTemplate;
并且它将可供您的 Spring 托管对象使用。
如果您想使用不同的 Http 客户端(例如 Apache HttpComponents 客户端),您只需定义自己的模板即可:
@Bean
public RestTemplate restTemplate() {
return new RestTemplate(new HttpComponentsClientHttpRequestFactory());
}
工厂有一个默认构造函数,用于为特定的 http 客户端设置正确的 httpClient,因此您不必自己执行此操作。
代码的结构方式使得其他 http 客户端库可以轻松创建自己的 ClientHttpRequestFactory 实现,与仅在 RestTemplate 中指定所有内容相比,这使得它非常具有可扩展性。例如,也可以切换到不同类型的 ClientHttpRequestFactory。例如看一下 BufferingClientHttpRequestFactory 。这是一个不同的实现,但可以很容易地设置,因为它现在的设置方式。
关于java - Spring客户端配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51423599/