控制反转(IoC)、依赖注入(DI)、Autofacjava
一、 控制反转(IoC)程序员
控制反转(Inversion of Control)又称IoC,不少资料上会把控制反转和依赖注入(DI)放在一块儿去说,本身在刚学的时候一直认为他们是等同的概念,致使误入歧途。百度百科上对控制反转的解释是:控制反转(Inversion of Control,英文缩写为IoC)把建立对象的权利交给框架,是框架的重要特征,并不是面向对象编程的专用术语。它包括依赖注入(Dependency Injection,简称DI)和依赖查找(Dependency Lookup)。编程
控制反转是一种思想,有的地方也叫设计模式。控制反转的思想是把建立对象的权利由调用者转变为提供者。什么意思呢?咱们在程序之中会常常去建立对象(new object()),若是把对象当成一项服务,那么须要这项服务的就是调用者,提供这项服务的就是提供者。举个例子:咱们都知道“一骑红尘妃子笑”的故事,在这个故事中想吃荔枝的杨贵妃就是调用者,荔枝就是服务的提供者。可是荔枝远在千里以外,杨贵妃要想吃到荔枝须要安排人马不停蹄给他运过来。那么运送的过程就是建立服务对象的过程,杨贵妃想吃到荔枝就须要本身去控制运送。这就是经典的调用者建立服务的过程。那么控制反转呢?顾名思义,就是把控制权进行反转。服务的提供者来建立服务对象,调用者在须要的时候直接调用。也就是说荔枝摘下来的时候就运到宫中冷窖保存,等杨贵妃何时想吃就把荔枝拿出来。那么冷窖就是咱们以后要说的容器。设计模式
既然控制反转只是一种设计的思想,那么实现这种思想的方式是什么呢?框架
依赖查找:容器提供回调接口和上下文条件给组件。EJB和Apache Avalon 都使用这种方式。这样一来,组件就必须使用容器提供的API来查找资源和协做对象,仅有的控制反转只体如今那些回调方法上(也就是上面所说的 类型1):容器将调用这些回调方法,从而让应用代码得到相关资源。函数
依赖注入:组件不作定位查询,只提供普通的Java方法让容器去决定依赖关系。容器全权负责的组件的装配,它会把符合依赖关系的对象经过JavaBean属性或者构造函数传递给须要的对象。经过JavaBean属性注射依赖关系的作法称为设值方法注入(Setter Injection);将依赖关系做为构造函数参数传入的作法称为构造器注入(Constructor Injection)ui
二、 依赖注入(DI)设计
如今经常使用的实现控制反转的方式是依赖注入。依赖注入意思就是把对象之间的依赖关系注入到IoC容器中。这样作的目的就是为了解耦,以实现软件设计的高内聚,低耦合。对象
依赖注入的方式有如下三种。接口
构造函数注入:
在构造期间完成一个完整的、合法的对象。全部依赖关系在构造函数中集中呈现。依赖关系在构造时由容器一次性设定,组件被建立以后一直处于相对“不变”的稳定状态。只有组件的建立者关心其内部依赖关系,对调用者而言,该依赖关系处于“黑盒”之中。
Setter注入:
对于习惯了传统 javabean 开发的程序员,经过 setter 方法设定依赖关系更加直观。若是依赖关系较为复杂,那么构造子注入模式的构造函数也会至关庞大,而此时设值注入模式则更为简洁。若是用到了第三方类库,可能要求咱们的组件提供一个默认的构造函数,此时构造子注入模式也不适用。
接口注入:
接口注入模式由于具有侵入性,它要求组件必须与特定的接口相关联,所以并不被看好,实际使用有限。
三、 Autofac使用
容器
IContainer对象是Autofac的容器。容器的建立经过ContainerBuilder对象的Build()方法来建立。
注入依赖关系
ContainerBuilder对象将依赖关系注入到IContainer容器之中。
生成对象
经过IContainer对象的Resolve<T>()方法来获取对象。
--未完待续,以后会经过实际的例子来讲明Autofac的使用方式。