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

How does CDI container fit in EJB/Web container of Java EE server?

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

但是我发现了关于如何集成 CDI 组件的不同信息。在文献中 some 谈到 CDI 容器(CDI 容器自动为您管理范围内的所有 bean”),但其他人将其定义为 [= 提供的上下文服务28=] EE 容器。在 Whosebug 上什至有一个名为 "IOC-Container" 的标签。那么,如果它是一个容器,那么 EJB/Web 容器的那个容器是 part/inside 吗?

因此,如果我画了一张 Java EE 服务器及其组件和容器的图片(如上图),CDI 如何适应那里?它有自己的容器 "rectangle" 还是某个 EJB/Web 容器的一部分?您将如何在建筑设计中绘制它,您将如何 explain/describe 它?

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

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

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