3

我可以让多个线程使用相同的 HttpComponentsClientHttpRequestFactory 静态实例来安全地创建它们各自的 ClientHttpRequest 吗?

我找不到任何可以告诉我答案的手册。

我假设它是线程安全的,因为所有 createRequest 方法实际上都执行了请求对象的新实例化。例如,

public ClientHttpRequest createRequest(URI uri, HttpMethod httpMethod) throws IOException {
    HttpUriRequest httpRequest = createHttpUriRequest(httpMethod, uri);
    postProcessHttpRequest(httpRequest);
    return new HttpComponentsClientHttpRequest(getHttpClient(), httpRequest, createHttpContext(httpMethod, uri));
}

但随后它调用了一些其他可能不是线程安全的方法。

事实上,如果你知道答案,那么可以告诉我 Spring 中任何东西的线程安全性的手册在哪里?

4

1 回答 1

5

通常,Spring 基础结构中的任何以结尾的类在Factory初始化后都是线程安全的(即,一旦调用构造函数并使用其属性值初始化 bean)。从技术上讲,构造函数调用和属性注入之间不是线程安全的,但是ApplicationContext我知道的所有 Spring 实现都会阻塞对 bean 的请求,直到上下文初始化完成。

底线是:不要在 Spring 之外手动创建 Factory 对象,你应该没问题。

于 2013-11-14T22:19:35.293 回答