我应该使用@EJB还是@Inject

问题

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

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


#1 热门回答(161 赞)

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

在简单的情况下,你只需更改@EJB@Inject。在更高级的情况下(例如,当你严重依赖于988557104的属性,如beanName,lookupbeanInterface)时,为了使用@Inject,你需要定义a@Producer字段或方法。

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

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

JBoss Weld文档:
CDI and the Java EE ecosystem

堆栈溢出:
Inject @EJB bean based on conditions


#2 热门回答(30 赞)

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


#3 热门回答(12 赞)

**更新:**这个答案可能不正确或已过时。请参阅评论了解详情。

我从@Inject切换到@EJB,因为318898985允许循环注射而47945320pukes就可以了。

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