IOC控制反转
更新日期:
容器 和 控制反转 和 依赖注入
这里只是笔记
- 什么是容器?
- 什么是控制反转?
- 什么是依赖注入?
- 它们之间有什么关系?
概述
对象之间的耦合关系是无法避免的,也是必要的,这是协同工作的基础。
现在,伴随着工业级应用的规模越来越庞大,对象之间的依赖关系也越来越复杂,经常会出现对象之间的多重依赖性关系,因此,架构师和设计师对于系统的分析和设计,将面临更大的挑战。
对象之间耦合度过高的系统,必然会出现牵一发而动全身的情形。
然后,为了 解耦,软件专家 提出了IoC理论
控制反转 (Inversion of Controls)
控制反转(Inversion of Control)是一种是面向对象编程中的一种设计原则,用来减低计算机代码之间的耦合度。其基本思想是:借助于“第三方”实现具有依赖关系的对象之间的解耦。
引入一个 第三方的概念,全部对象的控制权全部上缴给“第三方”IOC容器,所以,IOC容器成了整个系统的关键核心,就像一个 粘合剂
看一下逻辑过程对比:
没有IOC容器之前,对象A依赖于对象B,那么对象A在初始化或者运行到某一点的时候,自己必须主动去创建对象B或者使用已经创建的对象B。无论是创建还是使用对象B,控制权都在自己手上。
引入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 | class User { |
什么是注入
我们换一种写法书写上面的例子:
1 | class User { |
像这种非自己主动初始化依赖,而通过外部来传入依赖的方式,我们就称为依赖注入。
控制反转 和 依赖注入
- 控制反转是一种思想
- 依赖注入是一种设计模式
依赖注入 只是 实现 控制反转的一种方式,而还有很多其他方式可以实现控制反转。
什么是IOC容器
由上面的分析可以知道,我们通过依赖注入方式,虽然做到了解耦,可是如果依赖层级数量和深度多了起来,那么我们需要维护一系列 类对象的 实例化过程和顺序,才能保证正确注入,容器就是为了解决这个问题。
- 容器帮助我们进行代码 实例化操作,容器会从上至下遍历 收集依赖,然后再从下至上进行初始化
就像一个工厂函数一样,容器隐藏了具体初始化代码的细节,我们发出需求,拿到结果即可。
最后
控制反转是一种在软件工程中解耦合的思想,调用类只依赖接口,而不依赖具体的实现类,减少了耦合。控制权交给了容器,在运行的时候才由容器决定将具体的实现动态的“注入”到调用类的对象中。
依赖注入是一种设计模式,可以作为控制反转的一种实现方式。依赖注入就是将实例变量传入到一个对象中去(Dependency injection means giving an object its instance variables)。
通过IoC框架,类A依赖类B的强耦合关系可以在运行时通过容器建立,也就是说把创建B实例的工作移交给容器,类A只管使用就可以
所以呢,是 容器控制了对象,控制了什么?控制了获取依赖资源的方式