【问题标题】:May I @Inject EjbService by CDI instead of by @Ejb?我可以通过 CDI 而不是 @Ejb @Inject EjbService 吗?
【发布时间】:2015-11-18 15:54:50
【问题描述】:

@Stateless public class EjbService {...},是@Inject EjbService myService; 好吗?

它真的会注入 SLSB,还是会创建新的 pojo?
这样插入的 myService 会是事务性的吗?
这样插入的 myService 会是线程安全的吗?

【问题讨论】:

  • 欢迎来到 Stack Overflow!我编辑了您的问题以使其更易于理解。祝你好运!
  • 如果您的容器使用的 CDI 版本是 Java EE 7 规范的一部分,那么如果您愿意,可以在托管、支持和 CDI bean 中使用 @inject 用于 EJB。如果您遇到错误,可能是因为您的应用程序服务器不兼容 Java EE 7(这很常见;没有很多 Java EE 7 应用程序服务器)。例如,TomEE 实现了 Java EE 6 Web 配置文件。

标签: jakarta-ee cdi java-ee-6 ejb-3.1 weld


【解决方案1】:

正如@scottb 指出的那样,如果它是特定版本的规范,则 EJB 将被注入,因为 EJB 是可注入对象的超集。

说了这么多,让我们一一道来:

  1. 新 POJO?如果它没有绑定到预定义的 CDI 上下文,那么它将是一个新的 POJO。这也可能因应用服务器而异。

  2. 事务性?这完全取决于应用程序服务器,如果应用程序服务器扫描识别 EJB,那么它取决于您的 EJB 配置中配置的事务控制类型。

  3. 线程安全?如果被容器实例化为 POJO,它将继承容器的线程安全特性(例如,servlet 容器)。同样,应用服务器可以将其扫描为 EJB,并在作为 POJO 注入时支持 EJB 样式的多线程。

总而言之,您可以将 SLSB 作为 POJO 注入,因为它毕竟是 POJO。但是,以这种方式注入时,您不能依赖 EJB 特定的行为,除非您已经在应用服务器上测试了所有内容,这可能比仅采用支持 EJB 的应用服务器更难且容易出错。

简而言之,当您只是将 EJB 作为 POJO 注入时,您就“不符合规范”。这意味着应用服务器不能保证符合 EJB 规范。

【讨论】:

  • 需要明确的是,如果 CDI 容器与 EJB 容器集成,则需要 @Inject 来注入 EJB 引用,而不是 POJO。如果 CDI 容器没有与 EJB 容器集成,那么它会按照你说的返回 POJO。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-08
  • 2016-03-28
  • 2019-03-02
  • 2012-02-01
  • 1970-01-01
  • 2011-12-29
相关资源
最近更新 更多