【问题标题】:How does dependency injection work in Spring?依赖注入在 Spring 中是如何工作的?
【发布时间】:2011-04-13 03:15:34
【问题描述】:

我想知道spring是如何进行依赖注入的。我想要使​​用低级逻辑。

更新:

我想知道对象引用是如何注入构造函数或setter方法的,是通过反射还是某些字节码级别。

【问题讨论】:

  • 您可以阅读代码,因为它是开源的。
  • @Preet 无论如何我正在阅读它。我想要一个概述。
  • “我在别处得到了答案,答案是字节码检测。” - 不,这不对。 95% 的 Spring 使用反射 API。字节码检测仅用于特殊类型的注入,例如方法查找注入。
  • @henry 你说得对,字节检测适用于 Spring AOP。
  • 这是最近面试官最喜欢的问题

标签: java spring dependency-injection


【解决方案1】:

Java 组件/类应尽可能独立于其他 Java 类。这增加了重用这些类并独立于其他类测试它们的可能性(单元测试)。为了将 Java 组件与其他 Java 组件分离,应该将对某个其他类的依赖注入到它们中,而不是由类本身创建/找到这个对象。

如果 A 类使用 B 类作为变量,则 A 类依赖于 B 类。

如果使用依赖注入,则通过类 A 的构造函数将类 B 赋予类 A - 这称为构造注入;或通过 setter - 这称为 setter 注入

依赖注入的一般概念称为控制反转。一个类不应该配置自己,而应该从外部配置。

基于独立类/组件的设计增加了测试软件的可重用性和可能性。例如,如果一个类 A 需要一个 Dao(数据访问对象)来接收来自数据库的数据,您可以轻松地创建另一个模拟数据库连接的测试对象,并将该对象注入 A 以测试 A 而无需实际的数据库连接。

使用标准 Java 可以实现基于依赖注入的软件设计。

Spring 通过提供提供配置的标准方式和管理对创建对象的引用,只是在使用依赖注入方面添加了一些简化。

更多信息请阅读this

编辑1

当 Spring 初始化其上下文时,它会在 Spring 应用程序 context.xml 文件中创建所有预先定义的 bean。 现在假设您的 Bean A 具有 B 的依赖关系,那么 B 的 Obj 已经在 Spring 中,因为它在 Spring 初始化时已成功创建。然后Spring会在A类中搜索setter方法,并在那里设置B的Obj。

编辑2:

Please read 5.4.1 Setter Injection

【讨论】:

  • 我在问“你是如何在构造函数中注入的”
  • @org.life.java 谢谢,你有 90% 在那里,但是你如何在运行时“在 A 类中搜索 setter 方法”。
  • 我们已经在应用程序 context.xml 文件中对其进行了配置,因此它将查找类的属性并为此查找标准设置器。
  • @org.life.java 请从技术上说出来,它如何寻找标准制定者。
  • @DeadProgrammer 你有没有回答你自己的问题“你是如何在构造函数中注入的”?
【解决方案2】:

从 XML、注解或 Java DSL (JavaConfig) 中读取依赖项的配置。然后 Spring DI 引擎使用 Java 反射 API 根据配置中的元数据连接依赖项。

【讨论】:

  • 我想知道它是如何连接依赖关系的。
  • 使用 Java 反射 API。我在答案中添加了这些信息。
  • 使用Java反射API,spring会明白它必须在那个特定点插入一个依赖,但是这个依赖是如何插入的呢?这是一些字节码级别的变化吗?
  • 实际的注入也是通过反射 API 执行的 - Method setFooMethod = class.getMethod("setFoo", Foo.class); setFooMethod.invoke(newObject, fooToInject);
  • 代理在这里和那里看到过几次,如果是通过反射完成的,为什么我们需要需要接口的代理
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-09
  • 2012-11-14
  • 1970-01-01
  • 2017-12-23
  • 2015-06-15
  • 2021-07-02
相关资源
最近更新 更多