java - Spring客户端配置

标签 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来创建使用HttpClientHttpComponentsClientHttpRequestFactory。文档只是说一个使用另一个但没有说明它们的作用?它们各自在“真实”世界(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/

相关文章:

java - try catch 与 try-with-resources

java - 将外部属性放入命名查询中

java - 使用 Spring RestTemplate 向每个 REST 请求添加查询参数

java - Spring RestTemplate 配置策略从单个 API 调用多个 rest 服务

java - 使用spring按需创建bean

java - MathML 和 Java

java - 在日期列中插入了错误的日期

java - Spring Boot jdbc 数据源自动配置在独立 tomcat 上失败

Spring OAuth : Custom form for authenticating authorization endpoint

Spring Cloud 多个 RestTemplate