我发现了这个问题: @ Inject 和@EJB 有什么区别,但我没有得到任何智慧。我以前没有使用过 JavaEE,也没有使用依赖注入的经验,所以我不知道应该使用什么?
@EJB是一种古老的注射方式吗?当使用 @Inject使用新的 CDI 框架时,EJB 容器在使用这个注释时是否完成了注入?这就是区别吗? 如果是这样的话,我应该使用 @Inject而不是 @EJB吗?
@EJB
@Inject
@Inject可以注入任何 bean,而 @EJB只能注入 EJB。您可以使用任何一种方法来注入 EJB,但是我更喜欢在任何地方使用 @Inject。
@EJB是用来注入 EJB 的,而且现在已经有相当长的一段时间了。@Inject可以注入任何托管 bean,并且是新 CDI 规范的一部分(从 JavaEE6开始)。
在简单的情况下,您可以简单地将 @EJB改为 @Inject。在更高级的情况下(例如,当您严重依赖于 @EJB的属性,如 beanName,lookup或 beanInterface) ,而不是为了使用 @Inject,您需要定义一个 @Producer字段或方法。
beanName
lookup
beanInterface
@Producer
这些资源可能有助于理解 @EJB和 @Produces之间的差异以及如何最大限度地利用它们:
@Produces
Antonio Goncalves 的博客: CDI 第一部分 CDI 第二部分 CDI 第三部分
JBoss 焊接文档: CDI 与 JavaEE 生态系统
堆栈溢出: 基于条件注入@EJB bean
这里有一个关于这个主题的很好的讨论。 Gavin King 建议非远程 EJB 使用@Inject over@EJB。
Http://www.seamframework.org/107780.lace
或者
Https://web.archive.org/web/20140812065624/http://www.seamframework.org/107780.lace
回复: 注射@EJB 还是@Inject? 2009年11月20日20:48美国/纽约 | 林克 · 加文 · 金 这个错误非常奇怪,因为 EJB 本地引用应该总是 也许是玻璃鱼里的虫子? 基本上,@Inject 总是更好,因为: it is more typesafe, it supports @Alternatives, and it is aware of the scope of the injected object. 我建议不要使用@EJB,除了声明对 远程 EJB。
回复: 注射@EJB 还是@Inject?
这个错误非常奇怪,因为 EJB 本地引用应该总是 也许是玻璃鱼里的虫子?
基本上,@Inject 总是更好,因为:
it is more typesafe, it supports @Alternatives, and it is aware of the scope of the injected object.
我建议不要使用@EJB,除了声明对 远程 EJB。
还有
回复: 注射@EJB 还是@Inject? 2009年11月17日17:42美国/纽约 | 林克 · 加文 · 金 它是否意味着@EJB 对远程 EJB 更好? 对于远程 EJB,我们不能像限定符那样声明元数据, @ Alternative 等等,在 bean 类上,因为客户端根本不是 将有权访问该元数据。此外,一些额外的 元数据必须指定,我们不需要为本地情况 (全球 JNDI 名称的任何东西)。所以,所有的东西需要去 其他地方: 即@Proproducts 声明。
2009年11月17日17:42美国/纽约 | 林克 · 加文 · 金
它是否意味着@EJB 对远程 EJB 更好?
对于远程 EJB,我们不能像限定符那样声明元数据, @ Alternative 等等,在 bean 类上,因为客户端根本不是 将有权访问该元数据。此外,一些额外的 元数据必须指定,我们不需要为本地情况 (全球 JNDI 名称的任何东西)。所以,所有的东西需要去 其他地方: 即@Proproducts 声明。
更新: 此答案可能不正确或已过期。详情请参阅评论。
我从 @Inject切换到 @EJB,因为 @EJB允许循环注射,而 @Inject在上面呕吐。
详细信息: 我需要 @PostConstruct来调用一个 @Asynchronous方法,但它会同步这样做。进行异步调用的唯一方法是让原始调用另一个 bean 的方法,并让它回调原始 bean 的方法。要做到这一点,每个 bean 都需要一个对另一个的引用——如此循环。@Inject在这个任务中失败了,而 @EJB却成功了。
@PostConstruct
@Asynchronous
注入已经存在于 JavaEE5中,例如@Resource、@PersisentUnit 或@EJB 注释。 但是它仅限于某些资源(数据源、 EJB. . .)和某些组件(Servlet、 EJB、 JSF 支持) 通过 CDI,您可以在任何地方注入几乎任何内容,这多亏了@Inject 注释。
在使用@EJB 和@Inject 时,理解会话 Bean 标识的术语差异可能也是有用的。 根据规范,以下代码将始终是 true:
true
@EJB Cart cart1; @EJB Cart cart2; … if (cart1.equals(cart2)) { // this test must return true ...}
使用@Inject 而不是@EJB 是不一样的。
更多信息请参见 无状态会话 bean 标识
在 EJB 中使用@EBJ。这是为了创建一个独立于接口类型的独立业务逻辑层(Tiered Applications)。
这(正确使用)允许将业务逻辑与(多个)用户界面应用程序分开修改和部署,而不会损失可用性。
当您严重依赖于@EJB 的属性(如 beanName、 lookup 或 beanInterface)时,您需要定义一个@Producer 字段或方法才能使用@Inject。
@ Inject 是一个文档注释,所以 IDEA 知道如何处理它,你可以在代码中看到不同的颜色。@ EJB-不。