控制反转(Ioc)与依赖注入(DI)
##讨论控制反转与依赖注入的关系: ###什么是控制反转? 对象之间耦合度过高,必然造成牵一发而动全身的结局。 为解决对象间的耦合度过高的问题,软件专家Michael Mattson提出了IoC理论,用来实现对象间的"解耦"。 **控制反转(Inversion of Control) **是一种面向对象编程中的一种设计原则,用来减低计算即代码之间的耦合度。 图1 图2 为什么叫控制反转(IoC)这个名字? 1、 软件系统在没有引入IOC容器之前,如图1所示,对象A依赖于对象B,那么对象A在初始化或者运行到某一点的时候,自己必须主动去创建对象B或者使用已经创建的对象B。无论是创建还是使用对象B,控制权都在自己手上。 2、软件系统在引入IOC容器之后,这种情形就完全改变了,如图2所示,由于IOC容器的加入,对象A与对象B之间失去了直接联系,所以,当对象A运行到需要对象B的时候,IOC容器会主动创建一个对象B注入到对象A需要的地方。 通过前后的对比,我们不难看出来:对象A获得依赖对象B的过程,由主动行为变为了被动行为,控制权颠倒过来了,这就是“控制反转”这个名称的由来。 ###什么是依赖注入? 依赖注入就是将实例变量传入到一个对象中去(Dependency injection means giving an object its instance variables)。 public class Human { ... Father father; ... public Human(Father father) { this.father = father; } } 将 father 对象作为构造函数的一个参数传入。在调用 Human 的构造方法之前外部就已经初始化好了 Father 对象。像这种非自己主动初始化依赖,而通过外部来传入依赖的方式,我们就称为依赖注入。 好处: ###控制反转和依赖注入的关系 IoC框架使用依赖注入作为实现控制反转的方式,但是控制反转还有其他的实现方式,例如说ServiceLocator,所以不能将控制反转和依赖注入等同。 控制反转是一种思想 Spring中的依赖注入简单来说,spring 使用xml配置文件,通过<bean>获取相应的对象(每个bean对应一个对象的实例,默认是单例模式,即在程序的生命周期中,所有的对象只有一个实例,进行重复使用),并存储在IoC容器中。 运行时,当需要某个对象,就可以从IoC容器中获取。也就是注入依赖。 ###总结: 1、控制反转是一种在软件工程中解耦合的思想,调用类只依赖接口,而不依赖具体的实现类,减少了耦合。控制权交给了容器,在运行的时候才由容器决定将具体的实现动态的“注入”到调用类的对象中。 2、依赖注入是一种设计模式,可以作为控制反转的一种实现方式。依赖注入就是将实例变量传入到一个对象中去(Dependency injection means giving an object its instance variables)。 3、通过IoC框架,类A依赖类B的强耦合关系可以在运行时通过容器建立,也就是说把创建B实例的工作移交给容器,类A只管使用就可以。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- c# – 使用XML数据库字段的Linq-to-SQL – 为什么这样工作?
- ruby-on-rails – 在Rails中使用MongoMapper的Paperclip 3
- 没有联合的结构类型别名/标记联合
- 常用正则表达式大全!(例如:匹配中文、匹配html)
- c – 单元测试复制构造和赋值运算符
- 一站式WPF--依赖属性(DependencyProperty)一
- [学习笔记]XML解析之DOM4J
- Nodejs正则表达式函数之match、test、exec、search、split、
- xcode – 任何人都可以共享示例.lldbinit文件吗?
- c – 使用boost :: shared_ptr(与reset()函数相关的分配问题