Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我应该使用@EJB还是@Inject_Java_Jakarta Ee_Ejb_Cdi - Fatal编程技术网

Java 我应该使用@EJB还是@Inject

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

我发现了这个问题:但我没有变得更聪明。我以前没有做过JavaEE,也没有依赖注入的经验,所以我不知道应该使用什么


@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进行注入

  • 2009年11月20:48美国/纽约链接加文·金
  • 这个错误非常奇怪,因为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美国/纽约链接加文·金

    这是否意味着@EJB更适合远程EJB

  • 对于远程EJB,我们不能像限定符一样声明元数据, @bean类上的Alternative等,因为客户机根本不是 将有权访问该元数据。此外,还有一些额外的问题 必须指定本地案例不需要的元数据 (全局JNDI名称)。所以所有这些东西都需要扔掉 其他地方:即@products声明


    更新:此答案可能不正确或过时。详情请参阅评论

    我从
    @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事件也可以是一种更简洁的方式(取决于需求)。虽然这在理论上可以回答这个问题,但最好在这里包含答案的基本部分,并提供链接供参考。这样,即使现在链接已断开,这个答案仍然很有价值。