如何 - Spring IoC和HttpClient 4.3.1 CloseableHttpClient?

nsa*_*yer 15 java spring apache-httpclient-4.x

我想让Spring IoC配置一个CloseableHttpClient对象并将其注入我的类中,以便可以通过XML完成其配置的自定义.

从我所看到的,HttpClient似乎非常强烈地抵制这种模式.他们希望你做的事情

CloseableHttpClient chc =
    HttpClients.custom().set<thing that should be a property>().build();
Run Code Online (Sandbox Code Playgroud)

伊克.

是否有一些制作单例CloseableHttpClientbean的机制我可以使用?

Mat*_*att 41

这似乎对我有用:

<bean id="requestConfigBuilder" class="org.apache.http.client.config.RequestConfig"
    factory-method="custom">
    <property name="socketTimeout" value="${socketTimeoutInMillis}" /> 
    <property name="connectTimeout" value="${connectionTimeoutInMillis}" /> 
</bean>

<bean id="requestConfig" factory-bean="requestConfigBuilder" factory-method="build" />

<bean id="httpClientBuilder" class="org.apache.http.impl.client.HttpClientBuilder"
    factory-method="create">
    <property name="defaultRequestConfig" ref="requestConfig" />
</bean>

<bean id="httpClient" factory-bean="httpClientBuilder" factory-method="build" />
Run Code Online (Sandbox Code Playgroud)

这给了我一个"httpClient"bean中的CloseableHttpClient,配置了套接字和连接超时.您应该能够向requestConfigBuilder或httpClientBuilder添加更多属性.

  • 使用Java配置,这可以仅在一个bean中完成,方法是将requestConfig bean和httpClient分开,或者复制精确的xml结构.关于应该做什么的最佳做法是什么?在Java中,如果在XML配置中将设置划分为四个步骤,那么它是否有意义? (3认同)

Sot*_*lis 8

使用Java配置,这很简单

@Bean
public CloseableHttpClient httpClient() {
    HttpClientBuilder builder = HttpClientBuilder.create();
    builder.setEverything(everything); // configure it
    CloseableHttpClient httpClient = builder.build();
}
Run Code Online (Sandbox Code Playgroud)

使用XML配置,它有点复杂.您可以创建自己的FactoryBean实现,例如CloseableHttpClientFactoryBean,将所有调用委托给a HttpClientBuilderbuild()内部调用getObject().

public class CloseableHttpClientFactoryBean implements FactoryBean<CloseableHttpClient> {
    private HttpClientBuilder builder;
    public CloseableHttpClientFactoryBean() {
        builder = HttpClientBuilder.create();
    }

    ... // all the setters
    // for example
    public void setEverything(Everything everything) {
        // delegate
        builder.setEverything(everything);
    }

    public CloseableHttpClient getObject() {
        return builder.build();
    }
}
Run Code Online (Sandbox Code Playgroud)

和配置

<bean name="httpClient" class="com.spring.http.clients.CloseableHttpClientFactoryBean">
    <property name="everything" ref="everything"/>
</bean>
Run Code Online (Sandbox Code Playgroud)

每种HttpClientBuilder方法都需要一个setter 方法.

请注意,如果您不需要任何自定义配置,则可以使用factory-method获取默认值CloseableHttpClient

<bean name="httpClient" class="org.apache.http.impl.client.HttpClients" factory-method="createDefault" >
</bean>
Run Code Online (Sandbox Code Playgroud)