我想让Spring IoC配置一个CloseableHttpClient
对象并将其注入我的类中,以便可以通过XML完成其配置的自定义.
从我所看到的,HttpClient
似乎非常强烈地抵制这种模式.他们希望你做的事情
CloseableHttpClient chc = HttpClients.custom().set().build();
伊克.
是否有一些制作单例CloseableHttpClient
bean的机制我可以使用?
使用Java配置,这很简单
@Bean public CloseableHttpClient httpClient() { HttpClientBuilder builder = HttpClientBuilder.create(); builder.setEverything(everything); // configure it CloseableHttpClient httpClient = builder.build(); }
使用XML配置,它有点复杂.您可以创建自己的FactoryBean
实现,例如CloseableHttpClientFactoryBean
,将所有调用委托给a HttpClientBuilder
和build()
内部调用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(); } }
和配置
<bean name="httpClient" class="com.spring.http.clients.CloseableHttpClientFactoryBean"> <property name="everything" ref="everything"/> </bean>
每种HttpClientBuilder
方法都需要一个setter 方法.
请注意,如果您不需要任何自定义配置,则可以使用factory-method
获取默认值CloseableHttpClient
<bean name="httpClient" class="org.apache.http.impl.client.HttpClients" factory-method="createDefault" > </bean>
这似乎对我有用:
<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" />
这给了我一个"httpClient"bean中的CloseableHttpClient,配置了套接字和连接超时.您应该能够向requestConfigBuilder或httpClientBuilder添加更多属性.