幸福和欢乐在于奋斗,而最有价值的是为梦想而奋斗
2.1 我们的理念是:让别人为你服务
Ioc(Inversion of Control/控制反转)是近年轻量级容器(Lightweight Container)兴起而逐渐进入大家眼帘的名词,又有别名称为依赖注入(Dependency Injection)。有一句非常有意思的话"Don't call us,we will call you."恰如其分的表达了“反转”的意味。这话中文意思“你不用找我们,我们会找你的”。。。。。感觉背部一阵阴风吹过!
Ioc提供了比原本更加轻松简单的方式,它的反转体现在不需要事必躬亲,转变为尽情的享受服务 -- 从此翻身当奴隶。。。。。。
通常情况下,被注入对象会直接依赖于被依赖对象。但是,在Ioc场景中,所有的被注入对象由IoC Service Provider统一管理。被注入的对象需要什么,直接跟IoC Service Provider招呼一声,后者就会把相应的被依赖对象注入到被注入对象中,从而达到IoC Service Provider为被注入对象服务的目的。
IoC简单来讲就一句话!原本是需要什么东西自己去拿,现在是需要什么东西就让别人送过来。
书上有个图我觉得蛮好玩的,截下来了:
以前单身的时候总是要自己去拿衣服,穿上再出门,结婚以后一个眼神就让老婆给你拿来衣服,还给你穿好,然后你给她一个吻在出门 (*^__^*) ,惬意的幸福生活!
2.2 手语,呼喊,还是心有灵犀
书上说道:IoC最权威的总结和解释,是Martin Fowler的文章“Inversion of Control Containers and the Dependency Injection pattern”,文章中提到了三种注入方式,我们下面就去看看
2.2.1 构造方法注入(constructor injection)
构造方法中声明依赖对象的参数列表,让IoC容器知道它需要哪些依赖对象。
此方法比较直观,对象构造完成后,即进入就绪状态,可以马上使用。
2.2.2 setter方法注入(setter injection)
只需要为依赖对象所对应的属性添加setter方法,就可以通过setter方法将相应的依赖对象设置到被注入对象中。
比构造方法注入宽松一些,可以在对象构造完成后再注入。
2.2.3 接口注入(interface injection)
被注入对象如果想要IoC Service Provider为其注入依赖对象,就必须实现某个接口。这个接口提供一个方法,用来为其注入依赖对象。IoC Service Provider最终通过这些接口来了解应该为被注入对象注入什么依赖对象。
接口注入比较死板和繁琐,是现在不甚提倡的一种方式,“退役”选手。
2.2.4 三种注入方式的比较
接口注入:入侵性太强,和上面提到的一样,”退役“,随风而去吧
构造方法注入:主要说下缺点:当依赖对象比较多的时候,构造方法的参数列表会比较长,通过反射构造对象的时候,对相同类型的参数的处理会比较困难,维护和使用上也比较麻烦。
setter方法注入:描述性比较好,可以被继承,允许默认值设置,事实上就是目前最好的赶脚。
2.3 IoC的附加值
先说说IoC好处,低侵入性、可测试性、可重用性和可扩展性等等。。这个仿佛生物进化一般,敲着敲着我们肯定会抽离出某些部分,方便我们更好的开发。
2.4 小结
讲到了IoC的概念,几种依赖注入的方式,理论比较多,适合看看,了解并消化理解。