【问题标题】:Spring - Prototype scope guarantees thread safe?Spring - 原型范围保证线程安全?
【发布时间】:2017-07-26 14:30:13
【问题描述】:

我已经尝试在互联网上找到,但我没有找到我想要的答案。 我正在 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 都会被实例化

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

【问题讨论】:

  • BackEndClient 线程安全吗? Spring 可以为您管理线程,但需要保护的 BackEndClient 的重要部分取决于您
  • @efekctive,BackEndClient 不是我们开发的。我们只有公开方法的接口。实现是隐藏的。假设它是线程安全的,像原型一样声明它是正确的?
  • RestService 是控制器吗?
  • 效果是一样的。但这是题外话。是的。原型应该绰绰有余。即使是单身人士也应该做到这一点
  • 想象一下只有一个端点。到实例的容器映射路径将创建 RestServiceImpl 的 一个 实例。然后@Autowire 将只使用一次。因此,由于需求,原型或单例的工作方式相同

标签: java spring multithreading rest jax-rs


【解决方案1】:

总而言之,这种情况下的范围在线程安全方面没有发言权。

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

【讨论】:

    【解决方案2】:

    您关心哪些线程问题?您没有指出这里的哪个组件不是线程安全的。如果它们都是线程安全的,则无需担心使它们成为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 中。原型实例是 提供给单例范围 bean 的唯一实例。

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

    【讨论】:

      猜你喜欢
      • 2012-07-06
      • 2012-03-28
      • 1970-01-01
      • 2011-09-22
      • 2013-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多