我应该使用@EJB还是@Inject

时间:2011-11-15 14:52:41

标签: java java-ee ejb cdi

我发现了这个问题:What is the difference between @Inject and @EJB但我没有更明智。我以前没有完成Java EE,也没有依赖注入的经验,所以我不明白我应该使用什么?

是@EJB和旧的注射方式吗?在使用@Inject时使用此批注时EJB容器是否完成注入使用新的CDI框架?这是不同的,如果是这种情况,我应该使用@Inject而不是@EJB吗?

6 个答案:

答案 0 :(得分:170)

@EJB仅用于注入EJB,现在可用一段时间了。 @Inject可以注入任何托管bean,并且是新CDI规范的一部分(自Java EE 6起)。

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

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

Antonio Goncalves的博客:
CDI Part I
CDI Part II
CDI Part III

JBoss Weld文档:
CDI and the Java EE ecosystem

的StackOverflow:
Inject @EJB bean based on conditions

答案 1 :(得分:30)

@Inject可以注入任何bean,而@EJB只能注入EJB。你可以使用任何一个注入EJB,但我更喜欢@Inject无处不在。

答案 2 :(得分:13)

更新:此回答可能不正确或已过期。有关详细信息,请参阅注释。

我从@Inject切换到@EJB,因为@EJB允许循环注入,而@Inject则允许循环注入。

详细信息:我需要@PostConstruct来调用@Asynchronous方法,但它会同步执行此操作。进行异步调用的唯一方法是让原始调用是另一个bean的方法,并让它回调原始bean的方法。要做到这一点,每个bean都需要引用另一个 - 因此是循环的。 @Inject执行此任务失败,而@EJB工作失败。

答案 3 :(得分:11)

以下是对该主题的一个很好的讨论。 Gavin King为非远程EJB推荐@Inject over @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 |链接Gavin King
  2.         

    该错误非常奇怪,因为EJB本地引用应始终如此   可序列化。也许是玻璃鱼中的虫子?

         

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

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

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

  

Re:用@EJB或@Inject注入?

     
      
  1. 2009年11月,17:42 America / New_York |链接加文·金

         

    对远程EJB来说,这对@EJB更好吗?

  2.         

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

答案 4 :(得分:3)

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

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

使用@Inject代替@EJB并不相同。

另见stateless session beans identity了解更多信息

答案 5 :(得分:0)

例如,

注入已经存在于Java EE 5中,其中包含@ Resource,@ PersistentUnit或@EJB注释。 但它仅限于某些资源(数据源,EJB ......)和某些组件(Servlet,EJB,JSF支持) 豆 。 。 )。使用CDI,您可以通过@Inject注释在任何地方注入任何内容。