我已经尝试在互联网上找到,但我找不到我想要的答案。 我正在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都是实例化的。
这是否足以保证线程安全? 什么可能是关键问题?
答案 0 :(得分:0)
总而言之,本案例中的范围在线程安全性方面没有发言权。
cotaniner可能只创建一个映射到@Path的RestServiceImpl实例。所以@Autowired将只使用一次,因此原型范围无用。真正的问题是如果第三方后端是线程安全的
答案 1 :(得分:0)
您关心哪些线程问题?您没有说明此处的哪个组件不是线程安全的。如果它们都是线程安全的,则无需担心它们prototype
范围。
如果客户端不是线程安全的,仅仅将客户端标记为prototype
范围是不够的。
当您使用具有依赖关系的单例范围的bean时 bean,请注意在实例化时解析依赖项。 因此,如果您依赖注入一个原型范围的bean到一个 单例范围的bean,一个新的原型bean被实例化然后 依赖注入到单例bean中。原型实例是 唯一提供给singleton-scoped bean的实例。
但是,假设您希望单例范围的bean获取新的 在运行时重复的原型范围的bean的实例。您 无法依赖 - 将原型范围的bean注入您的单例 bean,因为那个注入只发生一次,当春天 容器正在实例化单例bean并解析和 注入其依赖项。如果您需要原型的新实例 bean在运行时不止一次,请参阅Section 7.4.6, “Method injection”