如何 - Spring IoC 和 HttpClient 4.3.1 CloseableHttpClient?

2022-09-02 19:23:57

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

从我所看到的,似乎相当强行地抵制这种模式。他们希望你做这样的事情HttpClient

CloseableHttpClient chc =
    HttpClients.custom().set<thing that should be a property>().build();

哎呀。

难道没有一些机制来制作单例豆子,然后我可以使用吗?CloseableHttpClient


答案 1

这似乎对我有用:

<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 添加更多属性。


答案 2

使用Java配置,这就像

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

使用 XML 配置,它稍微复杂一些。您可以创建自己的实现,例如 ,它将所有调用委托给 a 和 内部调用。FactoryBeanCloseableHttpClientFactoryBeanHttpClientBuilderbuild()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>

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

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

<bean name="httpClient" class="org.apache.http.impl.client.HttpClients" factory-method="createDefault" >
</bean>

推荐