CDI 容器如何适应 Java EE 服务器的 EJB/Web 容器?

Lon*_*zak 7 ioc-container cdi jakarta-ee

Java EE 服务器具有不同的容器,如 EJB 或 Web 容器: 在此处输入图片说明

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

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

Sil*_*rus 7

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

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

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