Spring客户端配置

时间:2018-07-19 13:12:21

标签: java spring resttemplate

我对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并在其类中全部配置)?

1 个答案:

答案 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为例。这是一个不同的实现,但是可以很容易地进行设置,因为它的设置方式是现在。