一、概念
IoC是Inversion of Control的缩写,有的翻译成“控制反转”,还有翻译为“控制反向”或者“控制倒置”。
二、什么是IoC
IoC就是IoC,不是什么技术,与GoF一样,是一种设计模式。在Spring中控制反转是Spring框架的核心,其原理是基于OO设计原则的:Don‘t call us,we‘ll
call you(别来找我,我会来找你的)。也就是说,所有组件都是被动的,所有的组件初始化和调用都由容器负责。组件处在一个容器中,由容器负责管理。简单来讲,就是由容器控制程序之间的关系,而非传统实现中,由程序代码直接操控,即在一个类中调用另外一个类。这也就是所谓“控制反转”的概念:控制权由应用代码中转到了外部容器,控制权的转移,即所谓的反转。
三、传统实现中由程序代码直接操控的对象模型
通常我们倡议面向接口编程,接口驱动有很多好处,可以提供不同灵活的子类实现,增加代码稳定和健壮性等等,但是接口一定是需要实现的,也就是如下语句迟早要执行:AInterface a = new AInterfaceImp(); 这样一来,耦合关系就产生了,当前类与接口的具体实现类AInterfaceImp必然存在着依赖关系。
当然我们可以建立一个Factory来根据条件生成想要的AInterface的具体实现。表面上是在一定程度上缓解了以上问题,但实质上这种代码耦合并没有改变。只不过是将当前类只依赖与工厂,而工厂与接口的具体实现类之间仍然存在着依赖关系。加入工厂可以说一定程度上降低了代码的耦合度但并没有完全消除。
通过IoC模式可以彻底解决这种耦合,它把耦合从代码中移出去,放到统一的XML 文件中,通过一个容器在需要的时候把这个依赖关系形成,即把需要的接口实现注入到需要它的类中,这就是“依赖注入”。
四、应用IoC,由IoC容器管理对象的模型
IoC模式,系统中通过引入实现了IoC模式的IoC容器,即可由IoC容器来管理对象的生命周期、依赖关系等,从而使得应用程序的配置和依赖性规范与实际的应用程序代码分开。其中一个特点就是通过文本的配置文件进行应用程序组件间相互关系的配置,而不用重新修改并编译具体的代码。
可以把IoC模式看做是工厂模式的升华,可以把IoC看作是一个大工厂,只不过这个大工厂里要生成的对象都是在XML文件中给出定义的,然后利用Java 的“反射”编程,根据XML中给出的类名生成相应的对象。从实现来看,IoC是把以前在工厂方法里写死的对象生成代码,改变为由XML文件来定义,也就是把工厂和对象生成这两者独立分隔开来,目的就是提高灵活性和可维护性。
IoC中最基本的Java技术就是“反射”编程。通俗的说反射就是根据给出的类名(字符串)来生成对象。反射的应用是很广泛的,这种编程方式可以让对象在生成时才决定要生成哪一种对象。通过反射将依赖的对象注入到对象中,从而起到管理对象间的依赖关系。就像齿轮图中各个对象与容器紧密相连而对象之间没有一点依赖关系。
五、总结
IoC应用的好处是不言而喻的,首先软件中对象之间的复杂的依赖关系变得简单了,所有的对象都去依赖容器了,当然进一步说其实是容器去管理这些对象,这样依赖关系由从对象到容器变成了容器依赖于对象,即所谓的依赖倒转。还有Ioc容器把对象生成放在了XML里定义,所以当我们需要换一个实现子类将会变成很简单(一般这样的对象都是实现于某种接口的),只要修改XML就可以了,通过反射技术实现依赖注入,这样我们甚至可以实现对象的热插拔。