我应该使用@EJB还是@Inject

Luc*_*uke 143 java ejb java-ee cdi

我发现了这个问题:@ Inject和@EJB之间的区别是什么,但我没有更明智.我以前没有完成Java EE,也没有依赖注入的经验,所以我不明白我应该使用什么?

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

Pio*_*cki 173

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

在简单的情况下,您可以简单地更改@EJB@Inject.在更先进的情况下(例如,当您在很大程度上依赖@EJB的属性,如beanName,lookupbeanInterface)不是为了使用@Inject,你需要定义一个@Producer字段或方法.

这些资源可能有助于理解之间的差异@EJB以及@Produces如何获得他们最好的:

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

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

StackOverflow:
根据条件注入@EJB bean

  • 为什么`@ EJB`适用于循环注入(一个单独的bean和另一个需要相互引用的bean)?(参考下面的答案 - 我不确定我是否通过切换到`@EJB'来做正确的事情) (4认同)
  • 因为您不是在注入实现,而是在实现上插入了一个代理。因此,您可以获得“后期绑定”和其他容器功能的优势。 (2认同)

Boz*_*zho 32

@Inject可以注入任何bean,而@EJB只能注入EJB.你可以使用任何一个注入EJB,但我更喜欢@Inject到处都是.

  • 当我们使用@Inject 时,究竟是什么导致了注入?JavaEE 容器?它可以注入 POJO 吗? (3认同)
  • 使用CDI它是CDI容器(捆绑在JavaEE容器中) (3认同)

nec*_*cer 15

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

我切换@Inject@EJB因为@EJB允许循环注射而@Inject在它上面呕吐.

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


Joh*_*nko 12

这是对该主题的一个很好的讨论.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 | 链接加文金

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

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

it is more typesafe,
it supports @Alternatives, and
it is aware of the scope of the injected object.
Run Code Online (Sandbox Code Playgroud)

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

Re:用@EJB或@Inject注入?

  1. 2009年11月17日,美国/纽约| 链接加文金

    对于远程EJB,这对@EJB更好吗?

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


ken*_*ken 5

了解使用 @EJB 和 @Inject 时会话 Bean 身份方面的差异也可能很有用。\n根据规范,以下代码将始终是true

\n\n
@EJB Cart cart1;\n@EJB Cart cart2;\n\xe2\x80\xa6 if (cart1.equals(cart2)) { // this test must return true ...}\n
Run Code Online (Sandbox Code Playgroud)\n\n

使用@Inject 代替@EJB 是不一样的。

\n\n

另请参见无状态会话 Bean 身份以获取更多信息

\n