Ioc 全名Inversion of Control ,翻译过来就是控制反转的意思.上一篇文章中,我们学习了依赖注入.
Spring能有效地组织J2EE应用各层的对象.不管是控制层的Action对象,还是业务层的Service对象,还是持久层的DAO层对象,都可在Spring的管理下有机的协调,运行.Spring将各层的对象以松耦合的方式组合在一起,Action对象无须关心Service对象的具体实现,Service对象无须关心持久层对象的具体实现,各层对象的调用完全面向接口.当系统需要重构时,代码的改写量将大大减少.
上面所说的一切都得益于Spring的核心机制----依赖注入,依赖注入让Bean与Bean之间以配置文件组织在一起,而不是以硬编码的方式耦合在一起.
依赖注入(Dependency Injection)和控制反转是同一个概念.
具体含义是:当某个角色(可能是一个Java实例,调用者)需要另外一个角色(另外一个Java实例,被调用者)的协助时,在传统的程序设计过程中,通常由调用者来创建被调用者的实例.但在Spring里,创建被调用者的工作不在由调用者完成,因此称为控制反转:创建被调用者实例的工作通常由Spring容器来完成,然后注入调用者.因此也称为依赖注入.
不管是依赖注入,还是控制反转,都说明Spring采用动态,灵活的方式来管理各种对象.对象与对象之间的具体实现互相透明,下面以一个示例来理解一下依赖注入.
假设有一个学生(调用者)使用一根笔(被调用者)的逻辑,那么战士拿到笔可以有下面3种方式.
1.学生是一个动手能力强的孩子,自己制作一只笔,这形象的说明了在Java开发中,在调用者中创建被调用者的开发方式
2.学生去制作笔的厂子里买笔,自己去制笔厂买.这种情况下,学生不需要自己做,但是需要自己去工厂,这就是Java开发中的简单工厂的设计模式.
3.还有一种更简单的方式获得笔,就是直接在楼下商店买,商店的笔是从工厂买的,交给学生.而对于学生来说,只需要在商店买就行了,不用关心笔是如何制作和运输的.显而易见,这是一种最简单,最有效率的一种方式,这种方式就是依赖注入.
所谓依赖注入,是指程序运行过程中,如果需要调用另一个对象协助时,无须在代码中创建被调用者,而是依赖于外部的注入.Spring的依赖注入对调用者和被调用者几乎没有任何要求,完全支持对POJO之间依赖关系的管理.
IoC(Inversion of Control),控制反转,其原理是基于好莱坞原则(The Hollywood Principle):"Don't call us,we'll call you(不要打电话找我,我会打给你的)".也就是说,所有的组件是被动的,所有的组件初始化和调用都有容器负责,并有容器负责管理.
IoC的实现方式