我对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
才能创建使用HttpComponentsClientHttpRequestFactory
的{{1}}。该文档只是说一个人使用另一个,而没有说他们做什么?它们在“真实”世界(HttpClient
世界)中分别代表什么,它们又有何不同之处?为什么我们需要它们将它们包裹在一起(例如,为什么不创建http
并在其类中全部配置)?
答案 0 :(得分:1)
在春季,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托管对象可用。
如果要使用Apache HttpComponents客户端之类的其他Http客户端,您需要做的就是定义自己的模板:
@Bean
public RestTemplate restTemplate() {
return new RestTemplate(new HttpComponentsClientHttpRequestFactory());
}
工厂具有用于为特定http客户端设置正确的httpClient的默认构造函数,因此您不必自己这样做。
代码的结构使得其他http客户端库可以轻松创建自己的ClientHttpRequestFactory实现,与仅在RestTemplate中进行指定相比,它具有很高的可扩展性。例如,也可以切换到其他类型的ClientHttpRequestFactory。以BufferingClientHttpRequestFactory为例。这是一个不同的实现,但是可以很容易地进行设置,因为它的设置方式是现在。