Spring - Prototype范围保证线程安全吗?

时间:2017-07-26 14:30:13

标签: java spring multithreading rest jax-rs

我已经尝试在互联网上找到,但我找不到我想要的答案。 我正在JAX-RS(球衣实施)中开发休息服务。

在我的休息服务中,我已经宣布了一个用于调用后端服务的客户端。

我如何宣布这个客户是我的问题。

@Path("/restService")
public class RestServiceImpl implements RestService {

    @Autowired
    private BackEndClient backEndClient;

    //below there are GET, POST requests...
application-context.xml

中的

<bean id="backEndClient" class="it.business.backend.client.BackEndClient" scope="prototype"> </bean>

你怎么看,我用Spring管理bean实例化。在xml方面,这个bean是原型。 因此,对于每个请求,RestServiceImpl和backEndClient都是实例化的

这是否足以保证线程安全? 什么可能是关键问题?

2 个答案:

答案 0 :(得分:0)

总而言之,本案例中的范围在线程安全性方面没有发言权。

cotaniner可能只创建一个映射到@Path的RestServiceImpl实例。所以@Autowired将只使用一次,因此原型范围无用。真正的问题是如果第三方后端是线程安全的

答案 1 :(得分:0)

您关心哪些线程问题?您没有说明此处的哪个组件不是线程安全的。如果它们都是线程安全的,则无需担心它们prototype范围。

如果客户端不是线程安全的,仅仅将客户端标记为prototype范围是不够的。

http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#beans-factory-scopes-sing-prot-interaction

  

当您使用具有依赖关系的单例范围的bean时   bean,请注意在实例化时解析依赖项。   因此,如果您依赖注入一个原型范围的bean到一个   单例范围的bean,一个新的原型bean被实例化然后   依赖注入到单例bean中。原型实例是   唯一提供给singleton-scoped bean的实例。

     

但是,假设您希望单例范围的bean获取新的   在运行时重复的原型范围的bean的实例。您   无法依赖 - 将原型范围的bean注入您的单例   bean,因为那个注入只发生一次,当春天   容器正在实例化单例bean并解析和   注入其依赖项。如果您需要原型的新实例   bean在运行时不止一次,请参阅Section 7.4.6, “Method injection”