【发布时间】:2015-07-15 15:41:15
【问题描述】:
我学习Java EE有一段时间了,发现Java EE提供了两种注入机制
- 资源注入
- 依赖注入
请指导我理解资源注入和依赖注入之间的区别。
【问题讨论】:
标签: java dependency-injection cdi
我学习Java EE有一段时间了,发现Java EE提供了两种注入机制
请指导我理解资源注入和依赖注入之间的区别。
【问题讨论】:
标签: java dependency-injection cdi
来自source:
资源注入使您可以注入任何可用的资源 JNDI 命名空间到任何容器管理的对象,例如 servlet, 企业 bean 或托管 bean。例如,我们可以使用资源 注入以注入数据源、连接器或任何其他所需的 JNDI 命名空间中可用的资源。
依赖注入使我们能够将常规 Java 类转换为 托管对象并将它们注入任何其他托管对象 (由容器管理的对象)。
资源注入和依赖注入的区别 下面列出了 RI 和 DI 之间的区别。
资源注入可以直接注入 JNDI 资源,而依赖注入不能。
依赖注入可以直接注入常规类(托管 bean),而资源注入则不能。
资源注入按资源名称解析,而依赖注入按类型解析。
依赖注入是类型安全的,而资源注入不是。
【讨论】:
@Produces将普通的Java EE资源注入变成“类型安全”的依赖注入。
Java EE 提供了注入机制,使我们的对象能够获得对资源和其他依赖项的引用,而无需直接实例化它们(显式使用“new”关键字)。我们只需通过使用表示编译器注入点的注释绘制字段或方法来在我们的类中声明所需的资源和其他依赖项。
然后容器在运行时提供所需的实例。 Injection 的优势在于它简化了我们的代码并将其与其依赖项的实现解耦。
这两种方法都有助于实现控制反转。
【讨论】:
Rahul Tripathi 的答案是准确且正确的。但是为了更简洁地说明它可以帮助您决定使用哪个,让我们这样看:DI 通常用于将实现类分配给接口。而 RI 用于从 JNDI 中提取属性值和 JDBC 连接。 DI 允许您针对接口编写代码,然后决定使用哪个实现。有一些重叠,通常是当 RI 的对象不仅仅是一个属性值,并且当 DI 用于传递一个属性值时。正如我已经提到的,这种重叠的一个很好的例子是 JDBC 连接。 JDBC 连接不仅是一个连接字符串(属性值),它还是一个实现(要使用哪些驱动程序)。
我认为如果您使用 DI 并且需要传递一些属性值,请继续使用 DI。如果你正在使用 RI 并且需要传递一个对象,那么如果可能的话,不要只在 RI 中进行。最终,如果您同时使用两者,则需要填写更多的 XML 文件。
【讨论】: