文章目录
  1. 1. 概述
  2. 2. 控制反转 (Inversion of Controls)
  3. 3. 依赖注入
    1. 3.1. 什么是依赖
    2. 3.2. 什么是注入
  4. 4. 控制反转 和 依赖注入
  5. 5. 什么是IOC容器
  6. 6. 最后

容器 和 控制反转 和 依赖注入

这里只是笔记

  • 什么是容器?
  • 什么是控制反转?
  • 什么是依赖注入?
  • 它们之间有什么关系?

概述

对象之间的耦合关系是无法避免的,也是必要的,这是协同工作的基础。

现在,伴随着工业级应用的规模越来越庞大,对象之间的依赖关系也越来越复杂,经常会出现对象之间的多重依赖性关系,因此,架构师和设计师对于系统的分析和设计,将面临更大的挑战。

对象之间耦合度过高的系统,必然会出现牵一发而动全身的情形。


然后,为了 解耦,软件专家 提出了IoC理论

控制反转 (Inversion of Controls)

控制反转(Inversion of Control)是一种是面向对象编程中的一种设计原则,用来减低计算机代码之间的耦合度。其基本思想是:借助于“第三方”实现具有依赖关系的对象之间的解耦。

引入一个 第三方的概念,全部对象的控制权全部上缴给“第三方”IOC容器,所以,IOC容器成了整个系统的关键核心,就像一个 粘合剂

看一下逻辑过程对比:

  1. 没有IOC容器之前,对象A依赖于对象B,那么对象A在初始化或者运行到某一点的时候,自己必须主动去创建对象B或者使用已经创建的对象B。无论是创建还是使用对象B,控制权都在自己手上。

  2. 引入IOC容器之后,对象A与对象B之间失去了直接联系,所以,当对象A运行到需要对象B的时候,IOC容器会主动创建一个对象B注入到对象A需要的地方。

结论:对象A获得依赖对象B的过程,由主动行为变为了被动行为,控制权颠倒过来了,这就是“控制反转”这个名称的由来。

依赖注入

依赖注入就是将实例变量传入到一个对象中去(Dependency injection means giving an object its instance variables)。

什么是依赖

如果在 对象 A 中,有 对象 B 的实例,则称 对象 A 对 对象 B 有一个依赖。
比如下面的例子,我们说User对DataBase有依赖:

1
2
3
4
5
6
class User {
public database: DataBase
constructor() {
this.database = new DataBase();
}
}

什么是注入

我们换一种写法书写上面的例子:

1
2
3
class User {
constructor( public database: DataBase) { }
}

像这种非自己主动初始化依赖,而通过外部来传入依赖的方式,我们就称为依赖注入。

控制反转 和 依赖注入

  • 控制反转是一种思想
  • 依赖注入是一种设计模式

依赖注入 只是 实现 控制反转的一种方式,而还有很多其他方式可以实现控制反转。

什么是IOC容器

由上面的分析可以知道,我们通过依赖注入方式,虽然做到了解耦,可是如果依赖层级数量和深度多了起来,那么我们需要维护一系列 类对象的 实例化过程和顺序,才能保证正确注入,容器就是为了解决这个问题。

  • 容器帮助我们进行代码 实例化操作,容器会从上至下遍历 收集依赖,然后再从下至上进行初始化
    就像一个工厂函数一样,容器隐藏了具体初始化代码的细节,我们发出需求,拿到结果即可。

最后

  1. 控制反转是一种在软件工程中解耦合的思想,调用类只依赖接口,而不依赖具体的实现类,减少了耦合。控制权交给了容器,在运行的时候才由容器决定将具体的实现动态的“注入”到调用类的对象中。

  2. 依赖注入是一种设计模式,可以作为控制反转的一种实现方式。依赖注入就是将实例变量传入到一个对象中去(Dependency injection means giving an object its instance variables)。

  3. 通过IoC框架,类A依赖类B的强耦合关系可以在运行时通过容器建立,也就是说把创建B实例的工作移交给容器,类A只管使用就可以

所以呢,是 容器控制了对象,控制了什么?控制了获取依赖资源的方式

文章目录
  1. 1. 概述
  2. 2. 控制反转 (Inversion of Controls)
  3. 3. 依赖注入
    1. 3.1. 什么是依赖
    2. 3.2. 什么是注入
  4. 4. 控制反转 和 依赖注入
  5. 5. 什么是IOC容器
  6. 6. 最后
顶部