控制反转(Inversion of Control)
一种面向对象的设计原则,降低计算机代码之间的耦合度
基本思想
借助于第三方(即IOC容器)来实现具有依赖关系的对象之间的解耦
- 谁控制谁,控制什么:
- 谁控制谁:
由IoC容器来控制对象- 控制什么:
IoC容器主要控制了被控制对象的外部资源的获取,包括依赖对象,文件,常量数据等
- 控制反转反转的是什么:
- 正转:
传统J2SE中,是在对象中主动去直接获取依赖的对象和资源- 反转:
由容器来负责创建和注入依赖对象,故而对象从传统的主动获取变成了控制反转后的被动接受- 反转了依赖对象和资源的获取
IoC能做什么
IoC容器负责控制以来对象的创建和查找,由容器进行组合对象,对象之间是松耦合的
IoC带来的最大的变化是思想上发生了主从换位的变化,将应用程序由传统的主动获取变化为被动等待
依赖注入(Dependency Injection)
原理概述
- 高端描述:
组件之间依赖关系由容器在运行期决定,即由容器动态的将某个依赖关系注入到组建之中。
- 接地气版:
依赖注入就是将实例变量传入到一个对象中去
含参的构造函数初始化就是依赖注入思想的一种体现,将被依赖的实例变量通过参数的方式传入,从而降低了耦合度
拆解分析:
- 谁依赖于谁:
应用程序依赖于IoC容器
- 为什么需要依赖:
应用程序需要IoC容器来提供程序内对象所需要的外部资源
- 谁注入了谁:
IoC容器注入了应用程序中的对象
- 注入了什么:
应用程序对象所需要的外部资源(依赖对象,常量数据等)
控制反转和依赖注入的关系
- 来自ITEYE某技术牛人的博客:
“依赖注入”明确描述了“被注入对象依赖IoC容器配置依赖对象”。
- W3Cschool中Spring教程中的内容:(个人比较倾向这种说法)
控制反转是一种思想
依赖注入是一种设计模式
依赖注入是控制反转的一种实现方式,控制反转同样具有其他的实现方式
总结
- 控制反转是一种在软件工程中解耦合的思想,调用类只依赖接口,而不依赖具体的实现类,减少了耦合。控制权交给了容器,在运行的时候才由容器决定将具体的实现动态的“注入”到调用类的对象中。
- 依赖注入是一种设计模式,可以作为控制反转的一种实现方式。依赖注入就是将实例变量传入到一个对象中去(Dependency injection means giving an object its instance variables)。
- 通过IoC框架,类A依赖类B的强耦合关系可以在运行时通过容器建立,也就是说把创建B实例的工作移交给容器,类A只管使用就可以。