我应该使用@EJB 还是@Inject

我发现了这个问题: @ Inject 和@EJB 有什么区别,但我没有得到任何智慧。我以前没有使用过 JavaEE,也没有使用依赖注入的经验,所以我不知道应该使用什么?

@EJB是一种古老的注射方式吗?当使用 @Inject使用新的 CDI 框架时,EJB 容器在使用这个注释时是否完成了注入?这就是区别吗? 如果是这样的话,我应该使用 @Inject而不是 @EJB吗?

117325 次浏览

@Inject可以注入任何 bean,而 @EJB只能注入 EJB。您可以使用任何一种方法来注入 EJB,但是我更喜欢在任何地方使用 @Inject

@EJB是用来注入 EJB 的,而且现在已经有相当长的一段时间了。@Inject可以注入任何托管 bean,并且是新 CDI 规范的一部分(从 JavaEE6开始)。

在简单的情况下,您可以简单地将 @EJB改为 @Inject。在更高级的情况下(例如,当您严重依赖于 @EJB的属性,如 beanNamelookupbeanInterface) ,而不是为了使用 @Inject,您需要定义一个 @Producer字段或方法。

这些资源可能有助于理解 @EJB@Produces之间的差异以及如何最大限度地利用它们:

Antonio Goncalves 的博客:
CDI 第一部分
CDI 第二部分
CDI 第三部分

JBoss 焊接文档:
CDI 与 JavaEE 生态系统

堆栈溢出:
基于条件注入@EJB bean

这里有一个关于这个主题的很好的讨论。 Gavin King 建议非远程 EJB 使用@Inject over@EJB。

Http://www.seamframework.org/107780.lace

或者

Https://web.archive.org/web/20140812065624/http://www.seamframework.org/107780.lace

回复: 注射@EJB 还是@Inject?

  1. 2009年11月20日20:48美国/纽约 | 林克 · 加文 · 金

这个错误非常奇怪,因为 EJB 本地引用应该总是 也许是玻璃鱼里的虫子?

基本上,@Inject 总是更好,因为:

it is more typesafe,
it supports @Alternatives, and
it is aware of the scope of the injected object.

我建议不要使用@EJB,除了声明对 远程 EJB。

还有

回复: 注射@EJB 还是@Inject?

  1. 2009年11月17日17:42美国/纽约 | 林克 · 加文 · 金

    它是否意味着@EJB 对远程 EJB 更好?

对于远程 EJB,我们不能像限定符那样声明元数据, @ Alternative 等等,在 bean 类上,因为客户端根本不是 将有权访问该元数据。此外,一些额外的 元数据必须指定,我们不需要为本地情况 (全球 JNDI 名称的任何东西)。所以,所有的东西需要去 其他地方: 即@Proproducts 声明。

更新: 此答案可能不正确或已过期。详情请参阅评论。

我从 @Inject切换到 @EJB,因为 @EJB允许循环注射,而 @Inject在上面呕吐。

详细信息: 我需要 @PostConstruct来调用一个 @Asynchronous方法,但它会同步这样做。进行异步调用的唯一方法是让原始调用另一个 bean 的方法,并让它回调原始 bean 的方法。要做到这一点,每个 bean 都需要一个对另一个的引用——如此循环。@Inject在这个任务中失败了,而 @EJB却成功了。

注入已经存在于 JavaEE5中,例如@Resource、@PersisentUnit 或@EJB 注释。 但是它仅限于某些资源(数据源、 EJB. . .)和某些组件(Servlet、 EJB、 JSF 支持) 通过 CDI,您可以在任何地方注入几乎任何内容,这多亏了@Inject 注释。

在使用@EJB 和@Inject 时,理解会话 Bean 标识的术语差异可能也是有用的。 根据规范,以下代码将始终是 true:

@EJB Cart cart1;
@EJB Cart cart2;
… if (cart1.equals(cart2)) { // this test must return true ...}

使用@Inject 而不是@EJB 是不一样的。

更多信息请参见 无状态会话 bean 标识

在 EJB 中使用@EBJ。这是为了创建一个独立于接口类型的独立业务逻辑层(Tiered Applications)。

这(正确使用)允许将业务逻辑与(多个)用户界面应用程序分开修改和部署,而不会损失可用性。

当您严重依赖于@EJB 的属性(如 beanName、 lookup 或 beanInterface)时,您需要定义一个@Producer 字段或方法才能使用@Inject。

@ Inject 是一个文档注释,所以 IDEA 知道如何处理它,你可以在代码中看到不同的颜色。@ EJB-不。