【问题标题】:How does CDI container fit in EJB/Web container of Java EE server?CDI 容器如何适应 Java EE 服务器的 EJB/Web 容器?
【发布时间】:2017-04-22 04:07:03
【问题描述】:

Java EE 服务器具有不同的容器,例如 EJB 或 Web 容器:

但是,我发现了有关如何集成 CDI 组件的不同信息。在 some 的文献中提到了 CDI 容器(“CDI 容器会自动为您管理范围内的所有 bean”),但其他人将其定义为 Java EE 容器提供的上下文服务。在 stackoverflow 上,甚至还有一个名为“IOC-Container”的标签。那么,如果它是一个容器,那么该容器是否是 EJB/Web 容器的一部分/内部?

那么,如果我绘制一张 Java EE 服务器及其组件和容器的图片(如上图所示),CDI 如何融入其中?它有自己的容器“矩形”还是某些 EJB/Web 容器的一部分?您将如何在建筑设计中绘制它,您将如何解释/描述它?

【问题讨论】:

  • CDI 有一个单独的容器
  • 您可以在 org.apache.openejb.cdi.OpenEJBLifecycle 中看到 OpenEJB 如何与 OpenWebBEans 集成。基本上这个过程是特定于实现的

标签: jakarta-ee cdi ioc-container


【解决方案1】:

CDI 有一个单独的容器。在您的图片中,它很可能是 EE 服务器端的另一个单独的矩形。谈到 EE 环境,CDI 由 EE 容器(通常是 RI - Weld)提供,因此容器将在(第一次)应用程序部署时为您启动它。

话虽如此,CDI 容器是每个 EE 服务器一个。即使您部署了多个使用 CDI 的 WAR 应用程序,仍然会有一个 CDI 容器。请注意,在 SE 环境中(Weld SE 允许您在 SE 环境中使用 CDI。),如果您愿意,您可以拥有多个这样的容器。

至于与 EJB 和 JSF 等其他 EE 的集成。例如,它们允许您使用基于 CDI 的功能 @Stateless@ViewScoped。所以他们必须“以某种方式”与 CDI 集成。现在这个魔法是在 EE 容器内完成的,通常是通过提供者的(焊接)SPI。例如,容器负责处理 EJB bean,然后将它们(通过 SPI)移交给 Weld,然后 Weld 可以将它们作为 CDI bean 接管,从而允许您将 @Inject 转换为 @Stateless bean。显然以上是对实际发生的事情的简化。

【讨论】:

  • 感谢您的解释。注意:AFAIK,@Stateless 不是基于 CDI 的功能,而是 EJB 功能。
  • 它们是由其他框架引入的基于 CDI 的功能(它们不在 CDI 本身内)。任何框架都可以扩展基本的 CDI 功能集并提供一些自己的功能 - 例如@Stateless。我就是这个意思。
猜你喜欢
  • 1970-01-01
  • 2013-06-15
  • 1970-01-01
  • 2013-12-19
  • 2010-11-19
  • 2013-09-24
  • 2011-04-25
  • 2012-04-14
相关资源
最近更新 更多