Java 我应该使用@EJB还是@Inject
我发现了这个问题:但我没有变得更聪明。我以前没有做过JavaEE,也没有依赖注入的经验,所以我不知道应该使用什么Java 我应该使用@EJB还是@Inject,java,jakarta-ee,ejb,cdi,Java,Jakarta Ee,Ejb,Cdi,我发现了这个问题:但我没有变得更聪明。我以前没有做过JavaEE,也没有依赖注入的经验,所以我不知道应该使用什么 @EJB是一种古老的注入方式吗?当使用@Inject使用新的CDI框架时,使用此注释时,EJB容器是否完成了注入?这就是区别吗?如果是这种情况,我应该使用@Inject而不是@EJB吗?@Inject可以注入任何bean,而@EJB只能注入EJB。您可以使用任何一种方法来注入EJB,但我更喜欢@inject无处不在。该@EJB仅用于注入EJB,并且在相当长的一段时间内可用@Injec
@EJB是一种古老的注入方式吗?当使用@Inject使用新的CDI框架时,使用此注释时,EJB容器是否完成了注入?这就是区别吗?如果是这种情况,我应该使用@Inject而不是@EJB吗?
@Inject
可以注入任何bean,而@EJB
只能注入EJB。您可以使用任何一种方法来注入EJB,但我更喜欢@inject
无处不在。该@EJB
仅用于注入EJB,并且在相当长的一段时间内可用@Inject
可以注入任何托管bean,并且是新CDI规范的一部分(自JavaEE6以来)
在简单的情况下,您只需将@EJB
更改为@Inject
。在更高级的情况下(例如,当您严重依赖@EJB
的属性,如beanName
、lookup
或beainterface
),而不是使用@Inject
时,您需要定义一个@Producer
字段或方法
这些资源可能有助于理解@EJB
和@products
之间的差异,以及如何充分利用它们:
Antonio Goncalves的博客:JBoss焊接文档:
堆栈溢出:
下面是关于这个话题的一个很好的讨论。Gavin King建议对非远程EJB使用@Inject over@EJB 或 Re:使用@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进行注入
更新:此答案可能不正确或过时。详情请参阅评论 我从
@Inject
切换到@EJB
,因为@EJB
允许循环注入,而@Inject
会吐在上面
详细信息:我需要
@PostConstruct
来调用@Asynchronous
方法,但它会同步执行。进行异步调用的唯一方法是让原始调用成为另一个bean的方法,并让它回调原始bean的方法。要做到这一点,每个bean都需要一个对另一个bean的引用——因此是循环的@Inject
此任务失败,而@EJB
正常工作 注入已经存在于JavaEE5中,例如带有@Resource、@PersistentUnit或@EJB注释。
但它仅限于某些资源(数据源、EJB…)和某些组件(servlet、EJB、JSF)
豆。使用CDI,由于@inject注释,您几乎可以在任何地方注入任何内容。在使用@EJB和@inject时,了解会话Bean标识方面的差异也可能很有用。 根据规范,以下代码将始终为
真
:
@EJB Cart cart1;
@EJB Cart cart2;
… if (cart1.equals(cart2)) { // this test must return true ...}
使用@Inject而不是@EJB是不一样的
另请参阅以获取更多信息为什么
@EJB
用于循环注入(一个单例bean和另一个bean需要相互引用)?(参考我下面的答案-我不确定切换到@EJB
)是否正确,因为您不是注入实现,而是插入实现的代理。正因为如此,您获得了“后期绑定”和其他容器特性的优势。当我们使用@Inject时,注入的具体含义是什么?JavaEE容器?它能注入POJO吗?有了CDI,它就是CDI容器(捆绑在JavaEE容器中)@MartijnBurger我手头没有代码,也没有JavaEE环境。只需创建两个Java类并将它们注入彼此的公共字段中。如果这有效,那么我的答案是错误的。如果这不起作用,那么到目前为止我的答案是正确的。下一步将@Inject
更改为@EJB
(并可能注释类本身?我忘了)。然后循环互注入应该可以正常工作。这就是为什么我从@Inject
切换到@EJB
。希望这有意义。我创建了两个pojo,并将pojo相互注入。在我的配置(WildFly 8.2=CDI 1.2)中没有问题。谢谢@MartijnBurger,我会确认这一点,同时在我的回答中添加一个注意事项。不完全确定您想要实现什么,但这可能正是您想要的,没有循环依赖性。异步CDI事件也可以是一种更简洁的方式(取决于需求)。虽然这在理论上可以回答这个问题,但最好在这里包含答案的基本部分,并提供链接供参考。这样,即使现在链接已断开,这个答案仍然很有价值。