我应该使用@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
的属性,比如beanName
, lookup
或者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注入?
- 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注入?
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注释。