控制反转的通俗理解
控制反转,是一种模式。直观地看字面意思,不太容易理解,特别是那个“反转”二字。一旦明白了它的含义,就会觉得这个描述是对的。
先不从技术入手,我们先从生活中的场景入手。
中国古代是农业社会,经济模式是小农经济。农民没有钱去买别人的东西,所以只能自己做。房子,自己盖;粮食蔬菜,自己种;面粉,自己磨;衣服,自己纺……。除了一些自己肯定做不了的东西,比如瓷碗、铁器等必须要买,其它的都自己做。
这就叫传统的依赖方式。我们人类是对这些“对象”有依赖性的,不能不穿衣,不能不吃饭。
但同时也有控制性,这些我自己做的东西,“都是我的”,是我主动创建的,我有控制权。
这些东西,也可以称为“依赖”,此处的依赖,这是个名词,指是我们依赖的这些东西。
后来,我们国家强大了,进入了工业社会,社会化分工越来越细,人们各司其职,都在做不同的产品。我再需要什么东西的时候,不必再自己做了,只要在某个地方登记一下,当我需要的时候,就会给我送来。这就叫“依赖注入”。比较形象的是你要买个空调,送来并安装==注入。“某个地方”就是IoC容器,现实生活中相当于超市、家电卖场等机构。我们下了订单,他们就给我们new了一个,送过来并安装好,相当于赋值操作。
但此时要注意,在我购买之前,空调的控制权并不在我这里,而是归卖场的。
我们对于“对象”的获取,是“被动接受”的方式。
所以这就叫“控制反转”,由主动变被动,更准确的名称应该是“控制权反转”。
再举一个IT界常见的现象。特别能说明什么是“控制反转”。
某油公司,早期的信息化建设是各自为政。每个下属单位包括集团直属部门都有自己的信息化团队,或者自己去找软件开发公司去构建自己的信息系统。各单位自己就是付款方,就是甲方,直接向软件公司提需求,软件公司直接实现,非常方便快捷,效率很高。这叫“传统依赖”模式,自给自足,丰衣足食(当然,这种模式有它的弊病,此处不提)。后来,集团决定所有信息化建设统一由集团直管的S软件公司负责。所有的信息化建设必须经过S公司,费用统一由集团数信部支付,也就是说数信部是S的甲方。各单位如果有软件需求,向S提。这时候问题就来了,S的甲方不是各单位,各单位需求实现程度,与S的收入关系不大,他们对于各单位提的需求就不是很积极。而且S的级别要比各单位高得多,这样一来的话,信息系统的控制权就完全不在各单位手里了。
这是一种典型的“控制反转”案例。信息系统的控制权由主动创建变为被动接受。
控制反转之所以称之为控制反转,是从“对于所依赖的对象的控制权的角度”来看的,由主动创建变为被动接受。
如果从业务类(使用依赖对象的类)的角度来看,这应该叫“依赖外包”。即,我所依赖的对象,不需要再自己创建了,外包出去,我需要的时候给我来一个。我不关心怎么来的,用的时候有这样一个实例就可以了。