您的位置:首页 > 编程语言 > Java开发

总结: 十分钟快速理解 Spring IoC 控制反转

2018-03-27 20:53 288 查看
       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的实现方式
实现数据访问层数据访问层有两个目标。第一是将数据库引擎从应用中抽象出来,这样就可以随时改变数据库—比方说,从微软SQL变成Oracle。不过在实践上很少会这么做,也没有足够的理由未来使用实现数据访问层而进行重构现有应用的努力。第二个目标是将数据模型从数据库实现中抽象出来。这使得数据库或代码开源根据需要改变,同时只会影响主应用的一小部分——数据访问层。这一目标是值得的,为了在现有系统中实现它进行必要的重构。模块与接口重构依赖注入背后的一个核心思想是单一功能原则(single responsibility principle)。该原则指出,每一个对象应该有一个特定的目的,而应用需要利用这一目的的不同部分应当使用合适的对象。这意味着这些对象在系统的任何地方都可以重用。但在现有系统里面很多时候都不是这样的. 随时增加单元测试把功能封装到整个对象里面会导致自动测试困难或者不可能。将模块和接口与特定对象隔离,以这种方式重构可以执行更先进的单元测试。按照后面再增加测试的想法继续重构模块是诱惑力的,但这是错误的。 使用服务定位器而不是构造注入实现控制反转不止一种方法。最常见的办法是使用构造注入,这需要在对象首次被创建是提供所有的软件依赖。然而,构造注入要假设整个系统都使用这一模式,这意味着整个系统必须同时进行重构。这很困难、有风险,且耗时。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息