【问题标题】:Why do prototype scope is used with Stateful bean?为什么原型作用域与 Stateful bean 一起使用?
【发布时间】:2019-07-24 22:03:08
【问题描述】:

春季文档 - 根据经验,您应该对所有有状态的 bean 使用原型范围,而对无状态 bean 应该使用单例范围。

因此,当您必须在上下文中一致地维护某些状态/数据时,有状态 bean 是必要的。说银行应用程序。您会希望您的对象在各种操作(存款、取款等)中保持同步。

所以在单例范围内,您会得到相同的东西 - 跨上下文的对象一致性。

那么为什么 javadoc 声明相反呢?

救命!! :)

【问题讨论】:

  • 如果你有一个单例有状态 bean,每次访问时都会覆盖状态,使其无用
  • 如果我在下面的回答解决了您的问题,您应该接受它(单击相应答案旁边的复选标记)。这有两件事。它让每个人都知道您的问题已得到您满意的解决,并为帮助您的人提供帮助。 See here 以获得完整的解释。

标签: java spring inversion-of-control javabeans


【解决方案1】:

这主要是由于在多线程环境中使用单例 bean 时需要保持同步问题。使用原型 bean,对 bean 的每个请求都会创建一个新的 bean 实例,因此您不需要关心跨线程同步访问 bean 的状态。但是在混合原型和单例 bean 时需要非常小心,因为原型 bean 只会被连接到单例 bean 中一次。也就是说,它在这个 bean 中实际上变成了单例......

如果你真的需要在单例 bean 中使用原型 bean,你应该use the @Lookup method annotation

大多数时候您不会遇到使用有状态 bean 的需要,因为状态是由单独的持久层或直接由调用者本身提供的。

具有状态的单例 bean 的一个示例是缓存。通过使用诸如 infinispan、guava、hazlecast 等专用缓存库,您无需在意同步,因为这些库会为您处理这方面的问题。

以您的银行示例为例,您可能不希望将交易详细信息存储在 Java 堆等临时存储中。如果您的应用程序由于某种原因崩溃,所有这些信息都将无法恢复地丢失。此信息需要存储在数据库等持久存储中。

【讨论】:

  • 没错,但万一有bean A是单例的;在 bean A 中是 bean B 类型的属性(这是原型);在这种情况下,对于bean B,每个spring容器仍然只有一个实例,因为父类是单例的。
  • 你在哪里找到这个:With prototype beans each thread will get a new instance of the bean?在 spring 文档中写为results in the creation of a new bean instance every time a request for that specific bean is made。有了这个,我明白每一个 thime 都会被引用到另一个 bean 中,例如。
  • @LinuRadu,是的,thread 不是最好的措辞,应该是请求。我会重新表述这一点。在上面的示例中,如果您有第三个 bean C,其属性类型为 B,则会有第二个 B 实例。
  • 对,正如你所指定的,将创建另一个类型B的实例,但是关于you don’t need to care about synchronizing access to the bean’s state across threads,你为什么说同步问题已经解决?可能以防万一你拥有所有的树豆原型(@RestController 和@Service)。
  • 没错。要点应该是“不要使用原型 bean”
猜你喜欢
  • 1970-01-01
  • 2011-12-28
  • 1970-01-01
  • 2021-11-15
  • 1970-01-01
  • 1970-01-01
  • 2019-06-06
  • 2015-07-24
  • 2012-09-21
相关资源
最近更新 更多