一.IoC
IoC—Inversion of Control,即“控制反转”。
控制反转: Ioc容器来控制对象的创建(控制),由容器来创建及注入依赖对象(反转),由我们自己在对象中主动控制去直接获取依赖对象(正转)
1996年,Michael Mattson在一篇有关探讨面向对象框架的文章中,首先提出了IOC 这个概念。面向对象设计及编程的基本思想,简单来说就是把复杂系统分解成相互合作的对象,这些对象类通过封装以后,内部实现对外部是透明的,从而降低了解决问题的复杂度,而且可以灵活地被重用和扩展。
IOC理论提出的观点大体是这样的:借助于“第三方”实现具有依赖关系的对象之间的解耦,如下图:
由于引进了中间位置的“第三方”,也就是IOC容器,使得A、B、C、D这4个对象没有了耦合关系,齿轮之间的传动全部依靠“第三方”了,全部对象的控制权全部上缴给“第三方”IOC容器。
若把上图中间的IOC容器拿掉,然后再来看看这套系统:
图4:拿掉IoC容器后的系统
此时,A、B、C、D这4个对象之间已经没有了耦合关系,这样的话,当你在实现A的时候,根本无须再去考虑B、C和D了,对象之间的依赖关系已经降低到了最低程度。所以,如果真能实现IOC容器,对于系统开发而言,这将是一件多么美好的事情,参与开发的每一成员只要实现自己的类就可以了,跟别人没有任何关系!
通过前后的对比,我们不难看出来:对象A获得依赖对象B的过程,由主动行为变为了被动行为,控制权颠倒过来了,这就是“控制反转”这个名称的由来。
3. IoC与DI
DI—Dependency Injection,即“依赖注入”:由容器动态的将某个依赖关系注入到组件之中。依赖注入(DI)和控制反转(IOC)是分别从主客体的角度的描述同一件事情。
依赖注入:应用程序依赖于IoC容器(依赖)注入应用程序所需的对象(注入)