Spring之IOC

   IOC (inversion of control ,控制反转)是spring的核心,贯串始终。所谓IOC,对于spring框架来说,就是有spring来负责对象的生命周期和对象间的关系:传统的开发模式:对象之间相互依赖。类似于找女朋友,哪里有长得漂亮,身材又好的女孩子,打听她们的兴趣爱好,手机号码,QQ号码,想尽一切办法去认识她,投其所好,这个过程是复杂和深奥的。我们必须自己设计和面对每个环节,传统的程序开发也是如此在一个对象中,要使用另外一个对象,就必须要得到它,自己要NEW一个,或者从JNDI中查询一个,使用完之后,我们还要将对象销毁,就比如数据库的链接,对象始终会和其他的接口或类耦合起来

IOC开发模式:ioc容器安排对象之间的依赖
    有点向通过婚介来找女朋友,我和女朋友之间引入了一个第三者,婚姻介绍所,婚介管理了很多男男女女的资料,我可以将向婚介所提出一个列表。告诉它我想什么样的女朋友。然后婚介就会按照我们的要求,提供这样的一个女孩子,我们只要去谈恋爱就可以。如果婚介给我们的人不符合我们的要求,我们就会抛出异常。整个过程不再由我自己控制,而是由婚介这样一个类似容器的机构来控制,spring所倡导的开发方式就是如此。所有的类都会在spring容器当中登记,告诉spring,你是个什么东西,你需要什么东西。然后spring会在系统运行到适当的时候,把你所要的东西,主动送给你,同时也把你交给其他需要你的东西,所有的类的创建,销毁都由spring来控制,也就是说控制对象生存周期的,不再是引用它的对象,而是spring对于某个具体的对象而言,以前是它控制其他对象,现在是所有的对象都被spirng控制,所以这叫控制反转,

ioc理论背景


    这幅图是我们传统系统当中,对象之间相互引用的一副对象,我们知道,在采用面向对象的系统当中,它的底层实现都是由N个对象所组成的,所有的对象通过彼此之间的合作,最终实现系统的业务逻辑。
图1中,它拥有多个独立的齿轮,这些齿轮相互耦合在一起,共同完成某项任务,我们可以看到在这样的齿轮组中,如果有一个齿轮出现了问题,就有可能影响到整个齿轮组的正常运转,齿轮与齿轮组的耦合关系就与软件系统中对象间的耦合关系,非常相似,对象之间的耦合关系,是无法避免的,也是必要的。这是协同工作的基础,现在伴随工业级应用规模越来越庞大,对象之间依赖关系也越来越复杂,经常会出现对象之间的多重依赖关系。对象之间过高的耦合关系,必将出现牵一发而动全身的情形。
为了解决这种问题,提出了IOC理论,用来实现对象之间的解耦,目前这个理论已经被成功的引用的实践当中,很多J2EE项目都采用了ioc框架产品。


解耦的过程


    这张图就是 利用IOC的原理为对象之间的关系进行一个解耦,IOC的处理方式简单来说就是把复杂系统分离成相互合作的对象,这些对象类,通过封装以后,内部实现对于外部是透明,从而降低问题解决的复杂度,而且灵活的被重复和扩展,IOC提出的观点大量是这样的。借助于第三方来实现对于一定依赖关系的对象的解耦,由于引进了中间位置第三方,也就是IOC容器。图2中 A B C D 全部都是依赖第三方,而之间没有互相依赖。齿轮之间的传统全部依靠第三方,全部对象的控制权,全部上交给第三方IOC容器,所以IOC容器成了整个系统的关键核心,它起到了一种粘合剂的作用。把系统中的所有对象粘合在一起发挥作用,如果没有这个粘合剂,对象和对象之间彼此会失去联系,这就是有人把IOC容器比成粘合剂的又来。





拿掉容器的样子
    图3 ,就是我们要实现整个系统所需要完成的全部内容,这时候A B C D 这四个对象之间没有了耦合关系,彼此毫无联系,这样的话当你实现A的时候,根本无需再去考虑 B C D了,对象之间的依赖关系,已经降低了最低程度,所以如果真的能实现IOC容器,对于系统开发而言,这将是意见多美好的事情,参与开发的每一个成员,只要实现自己的类就好了。跟别人没有任何关系。


依赖注入(DI)
    ioc的另外的名字叫做依赖注入,所谓的依赖注入,就是由IOC容器运行期间,动态的将某种依赖关系注入到对象之中。所以,依赖注入(DI)和控制反转(ioc)是从不同的角度的描述的同一件事情,就是通过引入IOC容器,利用依赖关系注入的方式,实现对象之间的解耦。



    生活中的例子,USB接口和usb设计都很熟悉,USB 为我们使用电脑提供了很大的方便,现在有很多外部设备都支持USB,现在我们利用电脑主机和USB接口来实现一个任务。从USB设备读取一个文件,电脑主机读取文件的时候它不关系USB 接口上连接的是什么设备,而且它确实是不需要知道连接的是什么设备,它的任务就是读取USB接口,挂接的设备只要符合USB接口的设计就可以了,所以,usb上链接一个U盘,主机就从U盘上读取数据,如果是usb上链接是一个硬盘,就从外置硬盘上读取数据。挂机外部设备的权利,来由我做主,就是控制权是归我的,至于USB接口挂接是什么设备,电脑主机是决定不了的,它只能被动的接受,电脑主机需要外部设备的时候,根本不用它告诉我,我就会主动的帮他挂接上他想要的外部设备,这就是我们生活中一个常见的依赖注入例子。

IOC的好处
    ioc在变成过程中不会对业务对象构成很强的侵入性,使用IOC之后,对象具有更好的可实行性,可重用性和可扩展性。听起来有些难以理解,USB地例子,使用USB的外部例子,和使用内置硬盘,能带来什么样的好处
    1、USB设备作为电脑主机的外部设备在插入主机之前与电脑主机之间没有任何的关系,只有被我们连接在一起之后。两者才发生了联系。具有相关性。所以两者中任何一方出现问题,都不会影响另一方。
这种特性体现在软件开发中就是可维护性。非常便于进行单元测试,便于调试程序。代码中的每一个class,都可以单独测试,彼此之间互不影响,只要保证自身的功能无误即可,这就是组建之间的低耦合或无耦合所带来的好处。
    2、usb设备和电脑主机之间的无关性,还带来另外一个好处,生产USB设备的厂商,和生产电脑主机的厂商,完全可以是互不相干的两个人,他们各干个事,他们之间唯一需要遵守的就是USB接口的标准,这种特性体现在软件开发当中,好处是比较大的。每一个开发团队的成员都只需要关系实现自身的业务逻辑,完全关系其他的人的工作进度,因为你的任务和别人没有关系,你的任务可以单独测试,你的任务也不用依赖别人的组件,在也不用扯不清责任,所以在一个大中型的项目当中,团队成员分工明确,责任明晰,很容易将一个大任务,拆分成细小的任务,开发效率得到大幅提高
    3、统一了标准,提高模块的复用性,比如说,统一USB外部设备,可以插入到任何支持USB接口的设备,可以插入电脑主机,也可以插入到DV机,USB外部设备可以给反复的利用,在软件工程当中,这种特性就是可复用性,我们可以把具有普遍性的长的组件,独立出来,反复的利用项目的其他部分,或则其他项目。当然这也是面向对象的基本特征,显然IOC不仅更好贯彻了这个原则,还提高了模块的复用性,符合接口标准的实现,都可以插入到支持此标准的模块当中
    4、模块具有热插拔性, 如USB外部设备,模块具有热插拔的特性,IOC生成对象的方式,转为外置方式,也就是把对象生成放置在配置文件进行定义,这样当我们更换一个实现子类,将会变的非常简单。只要修改配置文件就可以了。完全具有热插拔的特性。


IOC通俗的理解如下:
    ioc控制反转,说的是创建对象实例的控制权从代码控制剥离到IOC容器控制,实际就是你在XML文件控制,侧重于原理。
DI依赖注入,说的是创建对象实例时,为这个对象注入属性值或其他对象实例,侧重于实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值