我发现了这个问题:What is the difference between @Inject and @EJB但我没有更明智。我以前没有完成Java EE,也没有依赖注入的经验,所以我不明白我应该使用什么?
是@EJB和旧的注射方式吗?在使用@Inject时使用此批注时EJB容器是否完成注入使用新的CDI框架?这是不同的,如果是这种情况,我应该使用@Inject而不是@EJB吗?
答案 0 :(得分:170)
@EJB
仅用于注入EJB,现在可用一段时间了。 @Inject
可以注入任何托管bean,并且是新CDI规范的一部分(自Java EE 6起)。
在简单的情况下,您只需将@EJB
更改为@Inject
即可。在更高级的情况下(例如,当您严重依赖@EJB
的属性,如beanName
,lookup
或beanInterface
),而不是使用@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注入?
- 2009年11月,20:48 America / New_York |链接Gavin King
醇>该错误非常奇怪,因为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注入?
- 醇>
2009年11月,17:42 America / New_York |链接加文·金
对远程EJB来说,这对@EJB更好吗?
对于远程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注释在任何地方注入任何内容。