- Spring核心基础
- Spring - 首页
- Spring - 概述
- Spring - 架构
- Spring - 环境设置
- Spring - HelloWorld示例
- Spring - IoC容器
- Spring - Bean定义
- Spring - Bean作用域
- Spring - Bean生命周期
- Spring - Bean后处理器
- Spring - Bean定义继承
- Spring - 依赖注入
- Spring - 注入内部Bean
- Spring - 注入集合
- Spring - Bean自动装配
- 基于注解的配置
- Spring - 基于Java的配置
- Spring - Spring中的事件处理
- Spring - Spring中的自定义事件
- Spring - Spring框架中的AOP
- Spring - JDBC框架
- Spring - 事务管理
- Spring - Web MVC框架
- Spring - 使用Log4J进行日志记录
- Spring问答
- Spring - 问答
- Spring有用资源
- Spring - 快速指南
- Spring - 有用资源
- Spring - 讨论
Spring - 依赖注入
每个基于Java的应用程序都有一些对象协同工作,最终呈现给用户一个可运行的应用程序。在编写复杂的Java应用程序时,应用程序类应尽可能独立于其他Java类,以增加重用这些类的可能性,并在单元测试时独立于其他类对其进行测试。依赖注入(有时称为依赖注入)有助于将这些类粘合在一起,同时保持它们的独立性。
假设您有一个包含文本编辑器组件的应用程序,并且您想提供拼写检查功能。您的标准代码如下所示:
public class TextEditor { private SpellChecker spellChecker; public TextEditor() { spellChecker = new SpellChecker(); } }
我们在这里所做的是在TextEditor和SpellChecker之间创建了依赖关系。在控制反转场景中,我们将执行以下操作:
public class TextEditor { private SpellChecker spellChecker; public TextEditor(SpellChecker spellChecker) { this.spellChecker = spellChecker; } }
在这里,TextEditor无需担心SpellChecker的实现。SpellChecker将独立实现,并在TextEditor实例化时提供给TextEditor。整个过程由Spring框架控制。
在这里,我们消除了TextEditor的全部控制权,并将其保留在其他地方(即XML配置文件中),并且依赖项(即类SpellChecker)通过**类构造函数**注入到类TextEditor中。因此,控制流已被依赖注入(DI)“反转”,因为您已有效地将依赖关系委托给某个外部系统。
注入依赖的第二种方法是通过TextEditor类的**Setter方法**,我们将创建一个SpellChecker实例。此实例将用于调用setter方法来初始化TextEditor的属性。
因此,DI存在两种主要变体,以下两个子章节将分别举例说明:
序号 | 依赖注入类型及描述 |
---|---|
1 | 基于构造函数的依赖注入
当容器调用具有多个参数的类构造函数时,每个参数代表对其他类的依赖,就会实现基于构造函数的DI。 |
2 | 基于Setter的依赖注入
基于Setter的DI是通过容器在调用无参数构造函数或无参数静态工厂方法来实例化bean后,调用bean上的setter方法来实现的。 |
您可以混合使用基于构造函数和基于Setter的DI,但是一个好的经验法则是使用构造函数参数表示强制依赖项,使用setter表示可选依赖项。
使用DI原则,代码更简洁,当为对象提供其依赖项时,解耦更加有效。对象不会查找其依赖项,也不知道依赖项的位置或类,所有这一切都由Spring框架处理。