【问题标题】:Java EE Architecture - Where do CDI Beans belong to?Java EE Architecture - CDI Beans 属于哪里?
【发布时间】:2017-05-02 14:06:11
【问题描述】:

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

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

因此,如果我现在尽可能多地使用 CDI bean,那么通过 CDI 事件将事件从业务层传递到表示层是否可行并且是一种良好的做法?

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

更新:

我想得更深入一点,我认为这并不容易回答。在我发布的链接中,托管 bean 属于 Web 容器以及 ejb 容器。因此,我认为您可以将 CDI 范围的 bean(请求、会话)放置到 Web 容器中,因为 ejb 容器对此范围一无所知。但是应用程序范围的 bean 呢?

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

【问题讨论】:

    标签: java jakarta-ee ejb jms cdi


    【解决方案1】:

    这个问题真的很难回答,所以拿我说的一点点说。它并不精确,但试图让您更清楚地了解正在发生的事情。

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

    不管你怎么想,边界确实是模糊的,原因之一是任何 EJB bean 也自动成为 CDI bean。这意味着您现在一次将它们放在两个容器中(它只是代理,但仍然如此)。

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

    因此,如果我现在尽可能多地使用 CDI bean,那么通过 CDI 事件将事件从业务层传递到表示层是否可行并且是一种良好的做法?

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-15
      • 1970-01-01
      • 2015-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多