Java EE 架构 - CDI Beans 属于哪里?

标签 java jakarta-ee ejb jms cdi

我阅读了很多关于用 CDI Beans 替换 EJB 的文章,因为它们通常提供相同的功能等等。这让我想到了 CDI bean 属于哪里。对于 EJB,我知道它们属于 EJB-Container(图 1-7,https://docs.oracle.com/javaee/6/tutorial/doc/bnacj.html),但是对于 CDI,我无法真正想到 Web 和 EJB-Container 之间的分离。 CDI bean 是在 Web 容器还是 EJB 容器中“托管”的?

我有一种边界变得模糊的感觉。对于 EJB,我只是认为 EJB 容器代表了我的业务层。但现在业务层和表示层之间的边界更符合逻辑。

因此,如果我现在尽可能多地使用 CDI bean,是否可以通过 CDI 事件将事件从业务层传递到表示层?

当我想编写一个包含多个应用程序服务器的应用程序以实现负载平衡时,我是否需要 EJB 的远程处理功能?或者您是否为此目的使用 session 仿射负载平衡?

更新:

我进一步考虑了一下,我认为这并不容易回答。在我发布的链接中,托管 bean 既属于 Web 容器,也属于 ejb 容器。所以我认为您可以将 CDI 范围的 bean(请求、 session )放置到 Web 容器中,因为 ejb 容器对这个范围一无所知。但是应用程序作用域的 bean 呢?

我还注意到,这种模糊的边界也是由应用程序服务器处理 BeanManager 的方式造成的。在此博客中 https://struberg.wordpress.com/2015/02/18/cdi-in-ears/解释说,应用程序服务器处理 BeanManagers 有不同的方式。对此似乎没有明确的规范。

最佳答案

这个问题真的很难回答,所以请对我所说的持保留意见。它并不精确,但试图让您更清楚地了解正在发生的事情。

CDI 有自己的容器,所以如果这对您有帮助,您可以想象 bean 位于自己的容器中。为什么他们有自己的容器?嗯,因为它关注生命周期,就像 EJB 容器所做的那样。按需创建和销毁 bean,注入(inject)依赖项……但是对于 CDI,容器通常是“作用域”的(这里没有连接到 CDI 作用域!)每个部署的应用程序。例如。在您的应用程序服务器上,每个 WAR 都有这样一个容器,而对于 EJB,只有一个容器(毕竟,这就是为什么您可以拥有远程接口(interface)和 jndi 查找)。

无论您如何想象,边界确实是模糊的,原因之一是任何 EJB bean 也自动成为 CDI bean。这意味着您现在让它们同时位于两个容器中(这只是代理,但仍然如此)。

在层级方面,CDI 可以在任何地方——从数据库层(将实体管理器作为 bean 处理)、业务层和 EJB 一直到表示层,在 JSF 中,您可以通过 @Named 直接引用 bean 。 CDI 可让您将世界变成 bean ,您可以选择 CDI 处理什么,不处理什么。

So if I now make more use of CDI beans where possible, is it possible and good practice to communicate events from the business tier to the presentation tier via CDI Events?

无论如何,这是一个很好的方法。它为您提供了非常松散的耦合,您可以轻松地细化事件以限制通信工作。此外,如果您可以使用 CDI 2.0,您也会获得异步事件 - 甚至更好。

关于Java EE 架构 - CDI Beans 属于哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43680548/

相关文章:

java - Camel cxf with Spring boot-手动启动路线

java - 使用同一个表中的两个外键时会抛出 beancreation 异常

java - 实体 Bean、 session Bean、数据 Bean 和访问 Bean

java - 无法从 Struts 2 标记内部访问 scriptlet 变量

junit - Arquillian : Attempted to register the same Observer, ServerSetupObserver 多次

java - 停止单个quartz调度器

java - SAX 解析器不解析文件名

jakarta-ee - session Bean的 session 状态

java - EJB : does container need to synchronize entity bean persist?

java - javax.inject.Singleton 和 javax.ejb.Singleton 的区别