【问题标题】:Multiple instances of Sessionscoped Beans in the same session同一会话中的多个 Sessionscoped Bean 实例
【发布时间】:2018-10-11 13:27:56
【问题描述】:

如果在同一个会话中我实例化了多个 SessionScoped Bean 或 EJB(第一次通过容器注入,第二次通过“new”创建),会发生什么? 它会抛出错误吗? 如果不是,在注射过程中将使用它们中的哪一个? AppllicationScoped 和 RequestScoped 也一样?!

附:没有任何注释的类确实给它们一个明确的名称。

【问题讨论】:

  • 为什么要实例化多个 SessionScoped Bean?
  • 我不想要,但我在旧代码中看到它。我想知道会发生什么,并试图理解为什么要这样做。
  • Spring 没有被标记,但是在 Spring 下,相同类型的多个 bean 可以通过使用唯一名称来解析,因此每个实例都可以按名称注入,而不仅仅是依赖于类型。 Spring 还有其他选项,例如使用@Primary - 有关详细信息,请参阅docs。如果 Spring 无法解析 bean 依赖项,则应用程序将无法启动。
  • 春天不是这样,但很高兴知道。在我的情况下,这些类没有明确的名称。我会更新我的问题。谢谢
  • 不确定“实例化多个 SessionScoped Bean”是什么意思。一个正确管理的 SessionScoped bean 不应该被实例化,而是被注入,这意味着容器正在处理是从池中给你一个,还是在需要时创建一个新的。如果您正确地让容器为您管理 bean,那么在“会话”范围内,您应该每次都得到相同的返回。如果你是通过“new”直接实例化它,它并不是真正的 SessionScoped,而只是一个非托管的 pojo。

标签: java dependency-injection ejb cdi


【解决方案1】:

要拥有真正托管的 bean,您需要让 CDI 处理包括创建在内的生命周期。也有例外,但我们现在不要讨论。

对于您的情况,通过 new 创建的对象将根本不是托管 bean,CDI 不会知道它(除非它是某种生产者方法等的结果)。 您应该弄清楚为什么要创建它而不是仅仅注入现有的?

AppllicationScoped 和 RequestScoped 也一样?!

对于普通作用域 bean 的每个注入点,CDI 将查看底层“bean 存储”并查看您想要的 bean 是否已经创建并存储在那里。如果是这样,它只会返回你那个(或者,好吧,它的代理)。如果没有,它将创建一个新的并将其存储在那里以供将来参考。

所以简短的回答是,您不会有两个由 CDI 创建的普通范围 bean 的实例。

【讨论】:

  • 我认为这是这个问题的正确答案。我仍然无法弄清楚这样做是出于什么原因。我认为是否有任何模式,但据我所知,没有。谢谢你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多