标签:
1. IoC是什么?
IoC(Inversion of Control)即控制反转,不是什么技术,而是一种设计思想。在Java开发中,IoC 意味着将你设计好的对象交给容器去控制,而不是传统的在对象内部直接控制(比如说 new 一个对象)。理解好 IoC 的关键是要明确“谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些方面反转了“:
谁控制谁,控制什么:传统Java SE 程序设计,我们直接在对象内部通过 new 创建对象,是程序主动去创建依赖对象;而 IoC 是由 IoC容器来创建这些对象(在容器启动的时,容器会初始化 配置文件中定义的 bean,如果 bean 中添加参数 lazy-init="true" 则不会被创建对象); 谁控制谁?当然是 IoC容器控制对象。 控制什么? 主要控制了外部资源获取(不只是对象,也包括文件等。。。)
为何是反转:传统Java SE 程序设计,我们直接在对象内部通过 new 创建对象,是程序主动去创建依赖对象,也就是正转;而反转则是由容器来创建以及注入依赖对象。下面由两张图说明:
2. IoC 能做什么
传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,增加了维护难度;有了IoC容器后,把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,所以对象与对象之间是松散耦合,利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。
其实IoC对编程带来的最大改变不是从代码上,而是从思想上,发生了“主从换位”的变化。应用程序原本是老大,要获取什么资源都是主动出击,但是在IoC/DI思想中,应用程序就变成被动的了,被动的等待IoC容器来创建并注入它所需要的资源了。
IoC很好的体现了面向对象设计法则之一—— 好莱坞法则:“别找我们,我们找你”;即由IoC容器帮对象找相应的依赖对象并注入,而不是由对象主动去找。
3. IoC 和 DI
IoC的一个重点是:在系统运行过程中,动态的向某个对象提供它所需要的其他对象,而这一点是通过DI(Denpendency Injection,即依赖注入)来实现的。IoC 和 DI 是同一个概念的不同角度的描述。比如对象A需要操作数据库,以前我们总是要在A中自己编写代码来获得一个Connection对象,有了 spring我们就只需要告诉spring,A中需要一个Connection,至于这个Connection怎么构造,何时构造,A不需要知道。在系统运行时,spring会在适当的时候制造一个Connection,然后像打针一样,注射到A当中,这样就完成了对各个对象之间关系的控制。A需要依赖 Connection才能正常运行,而这个Connection是由spring注入到A中的,依赖注入的名字就这么来的。那么DI是如何实现的呢? Java 1.3之后一个重要特征是反射(reflection),它允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性,spring就是通过反射来实现注入的。
DI 是由Martin Fowler 在2004年初的一篇论文中首次提出的。他总结:控制的什么被反转了?就是:获得依赖对象的方式反转了。
标签:
原文地址:http://my.oschina.net/u/1757476/blog/517674