在Java中,资源注入和依赖注入(CDI)有什么区别?

25

我学习Java EE已经一段时间了,发现Java EE提供了两种注入机制:

  1. 资源注入
  2. 依赖注入

请指导我理解资源注入和依赖注入之间的区别。


1
资源注入 vs. 依赖查找:详解Java的两种主要IoC方式 - Bacteria
4个回答

29

根据来源:

资源注入允许您将JNDI命名空间中可用的任何资源注入到任何受容器管理的对象中,例如servlet、企业bean或托管bean。例如,我们可以使用资源注入来注入数据源、连接器或JNDI命名空间中的任何其他所需资源。

依赖注入允许我们将常规Java类转换为托管对象,并将它们注入到任何其他托管对象中(由容器管理的对象)。

资源注入和依赖注入之间的区别如下所列。

  1. 资源注入可以直接注入JNDI资源,而依赖注入无法直接注入。

  2. 依赖注入可以直接注入常规类(托管bean),而资源注入不能。

  3. 资源注入通过资源名称解析,而依赖注入通过类型解析。

  4. 依赖注入是类型安全的,而资源注入不是。


3
您可以使用@Produces将普通的 Java EE 资源注入转换为 "类型安全" 的依赖注入。 - Martin Andersson
2
谢谢解释! - user4867774


8
Java EE提供了注入机制,使我们的对象能够在不必直接实例化它们(使用“new”关键字)的情况下获取资源和其他依赖项的引用。我们只需通过在类中使用注解来声明所需的资源和其他依赖项,以指示编译器注入点即可。
容器随后在运行时提供所需的实例。注入的优点是简化了我们的代码,并将其与其依赖项的实现分离开来。
这两种方法都有助于实现控制反转。
请参阅我在此方面撰写的一篇文章:Resource Injection vs. JNDI Lookup

这个回答如何解决问题? - T_01

6
Rahul Tripathi的回答是准确和正确的。但为了更简洁地帮助您决定使用哪个,让我们这样看待它:DI通常用于将实现类分配给接口。而RI用于从JNDI中提取属性值和JDBC连接。 DI允许您针对接口编写代码,并在以后决定使用哪种实现。当RI'd对象不仅仅是属性值时,通常存在一些重叠,并且当DI用于传递属性值时。如我已经提到的,一个很好的例子是JDBC连接。 JDBC连接不仅是连接字符串(属性值),还是一个实现(要使用哪些驱动程序)。
我认为,如果您正在使用DI并且需要传递某些属性值,请继续使用DI。如果您正在使用RI并且需要传递对象,那么请尽可能在RI中执行。最终,如果两者都使用,则需要填写更多的XML文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接