我应该使用@EJB还是@Inject

我发现这个问题: @Inject和@EJB有什么区别,但我没有得到任何明智的。 我以前没有做过Java EE,也没有使用dependency injection的经验,所以我不明白我应该使用什么?

是@EJB和旧的注射方式? 在使用@Inject时使用此批注时,EJB容器是否使用新的CDI框架进行注入? 这是不同的,如果是这样的话,我应该使用@Inject而不是@EJB?

@EJB只用于注入EJB,现在已经有相当长的一段时间了。 @Inject可以注入任何托pipebean,并且是新的CDI规范(自Java EE 6以来)的一部分。

在简单情况下,您可以简单地将@EJB更改为@Inject 。 在更高级的情况下(例如,当你严重依赖@EJB的属性,比如beanNamelookup或者beanInterface )比使用@Inject更需要定义@Producer字段或方法。

这些资源可能有助于理解@EJB@Produces之间的差异,以及如何充分利用它们:

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

JBoss Weld文档:
CDI和Java EE生态系统

堆栈溢出:
根据条件注入@EJB bean

@Inject可以注入任何bean,而@EJB只能注入EJB。 你可以用来注入EJB,但是我更喜欢@Inject

更新:此答案可能不正确或过时。 请参阅评论的细节。

我从@Inject切换到@EJB因为@EJB允许循环注入,而@Inject在它上面放屁。

详细信息:我需要@PostConstruct来调用@Asynchronous方法,但它会同步。 使asynchronous调用的唯一方法是将原始调用作为另一个bean的方法,并让它调用原始bean的方法。 要做到这一点,每个bean都需要引用另一个 – 因此是循环的。 @Inject失败,而@EJB工作。

这是一个很好的讨论这个话题。 Gavin Kingbuild议通过@EJB注入非远程EJB。

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

要么

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

Re:用@EJB或@Inject注入?

  1. 2009年11月,20:48 America / New_York | 链接加文国王

这个错误很奇怪,因为EJB本地引用应该总是可序列化的。 在玻璃鱼的错误,也许?

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

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

我build议不要使用@EJB,除非声明对远程EJB的引用。

Re:用@EJB或@Inject注入?

  1. Nov 2009,17:42 America / New_York | 链接加文国王

    这是否意味着使用远程EJB可以更好地使用@EJB?

对于远程EJB,我们不能在bean类上声明像限定符,@Alternative等元数据,因为客户端根本无法访问该元数据。 此外,必须指定一些额外的元数据,我们不需要本地情况(全局JNDI名称)。 所以所有的东西都需要去别的地方:即@Produces声明。

在使用@EJB和@Inject时,理解会话Bean标识的区别也是有用的。 根据规范,以下代码将始终为true

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

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

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

例如,注入已经在Java EE 5中以@Resource,@ PersistentUnit或@EJB注释存在。 但它仅限于某些资源(数据源,EJB …)以及某些组件(Servlet,EJB,JSF支持bean …)。 随着CDI,你可以注入几乎任何地方感谢@Inject注释。