好几次面试都遇到面试官问:"你简历上说你熟悉ssh框架,那你简单谈谈spring中的ioc,aop等",遇到这类问题我真的很后悔之前为什么不好好打基础看概念然后在实践(因为学这个的时候我都是边看视频边实践的,所以过了一段时间概念性的东西很快就忘记了)。现在来总结下IOC是个什么东西,呵呵。
概念:IoC (Inverse of Control,控制反转),是指类A中有一个类B的对象,本来需要开发者在类A中初始化这个对象的,现在经过配置,spring可以自动地完成类A中的类B对象的初始化。这个过程也可以被叫作DI (Depend Injection,依赖注入),因为B类对象依赖于A类,通过spring 类B变量被注入到了A类的对象中。下面详细介绍缘由:
IOC是spring的核心,贯穿始终。所谓的IOC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系。举个简单的例子来说,我们如何找女朋友的?常见的情况是我们到处去看哪里有长得漂亮身材又好的的mm,然后想法设法的认识她们等流程,我们必须自己设计和面对每个环节。传统的程序开发也是如此,在一个对象中,如果要使用另外的对象则必须得到它(要么自己new一个,要么从JNDI中查询一个)使用完之后还要将对象摧毁等流程,对象始终会和其他的接口或类耦合在一起。、
然而,IOC是如何做到的呢,有点像你通过婚介找女朋友,通过第三方给你介绍,介绍认识之后,你们自己做自己想做的事情。然而这个第三方却管理了很多男男女女的资料,你只要告诉你的需求,它就会通过你的需要给你找到相关的mm;如果找到不到就会抛出异常。整个过程不再由我自己控制,而是有婚介这样一个类似容器的机构来控制。Spring所倡导的开发方式就是如此,所有的类都会在spring容器中登记,告诉spring你是个什么东西,你需要什么东西,然后spring会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由 spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转。如图一,由于引进了中间位置的“第三方”,也就是IOC容器
图1
IOC除了控制反转这个称呼之后,后面出现与之相关的称呼DI(Dependency Injection, 依赖注入)来实现的。比如对象A需要操作数据库,而我们以前每次都是在A中编写代码获取一个Connection对象,而有spring就需要告诉spring,A中需要一个Connection对象,至于该对象怎么构造,何时构造,A对象无需知道。在系统运行时,spring会在适当的时候构造一个Connection,注入到A当中,这样就完成了对各个对象之间关系的控制。而需要依赖Connection才能正常运行,而Connection是由spring注入到A当中的。这就是依赖注入。
作用(好处):配置灵活。 IOC模式,系统中通过引入实现了IOC模式的IOC容器,即可由IOC容器来管理对象的生命周期、依赖关系等,从而使得应用程序的配置和依赖性规范与实 际的应用程序代码分开。其中一个特点就是通过文本的配件文件进行应用程序组件间相互关系的配置,而不用重新修改并编译具体的代码。 因为把对象生成放在了XML里定义,所以当我们需要换一个实现子类将会变成很简单(一般这样的对象都是现实于某种接口的),只要修改XML就可以了。虽然说修改XML后不需要重新编译java代码,但XML经常与java源代码一起打包。所有想要修改XML的话,还是需要重新打包,还是免不了重新发布。就算修改java代码,重新编译这些修改后的代码,也不是太麻烦。那使用IOC模式最本质的好处是什么呢?有一种说法是,写大型程序的时候,会用到很多其他人开发的java类。当程序员甲用到程序员乙开发的java类A时,如果使用IOC,在程序员乙写好XML配置文件后,程序员甲就不需要关心类A应如果初始化的问题,直接使用即可。IOC有利于在多人开发大型程序中提高开发效率。
spring ioc的整体流程,xml配置
步骤编号 | 完成的工作 |
1 | spring容器读取配置文件,解析称注册表 |
2 | 根据注册表,找到相应的bean实现类实例化bean |
3 | 把实例化之后的bean放到spring容器中 |
4 | spring开放准备好的bean供程序使用 |