spring中IOC和DI

来源:互联网 发布:angularjs2 定义数组 编辑:程序博客网 时间:2024/06/07 17:17

1. 面向对象中对象的关系?
 在面向对象中,对象的关系有:依赖、继承、聚合(分为聚集和组合)。我们重点讲什么叫依赖。举个例子:老师让课代表收作业。老师要完成这一个事情,必须得有课代表才行,在这边的关系就是老师依赖课代表。

2. IOC和DI的具体概念
 IOC(Inverse of control)控制反转:将自身对象需要的外部资源进行控制反转,反转后自身对象不再持有外部资源的创建控制,而是由第三方对外部资源进行创建控制,然后再注入自身对象需要的资源。
 概括上来讲,凡是自己用的资源(通常是对象)不是自己准备的(比如主动创建这个对象),自己做的事情还受别人影响的都称之为IOC。

 DI(Dependency Injection)依赖注入:自身对象需要的资源,这些需要的资源都是以注入的方式进行注入到自身对象当中。
 概括上来讲,自身对象所需要的属性或资源由别人设置。所以DI是IOC中的一种,而AOP就是不是DI的一种IOC。
3. 控制反转

问题 解答 参与者有哪些? 有三个,自身对象,IOC/DI容器和外部资源 谁控制谁? IOC/DI对象控制自身对象 控制的是什么? 控制的是自身对象的实例创建

 我们通过画图来进行具体问题的分析:
传统和使用IOC思想解决问题的区别
 传统思想:
因为建房子需要打地基,所以为了完成这个任务,就将建房子和找施工队打地基这件事自己都做了。控制权都掌握在自己手中。在这当中,建房子就相当于自身对象,而打地基就相当于是外部资源。

 IOC思想:
配合上图中的进行分析,

步骤   a 自身对象为了完成建房子这件事,跟IOC/DI容器说需要地基 b IOC/DI容器寻找施工队,解决打地基的问题 c 施工队打好地基,将地基交给IOC/DI容器 d IOC/DI容器把地基交需要地基才能建房子的自身对象

4. 何为反转?
 所谓的反转是相对于正向而言的。那么什么是正向呢?拿上面的例子来说,自身对象为了完成建房子这件事,自己找施工队(可以理解为new了一个施工队),然后施工队打了地基完成建房子,这种情况就称之为正向。现在我们利用IOC思想,建房子需要的地基交给IOC/DI容器来完成,自己不用去找施工队(放弃了new施工队的主动权),将IOC/DI容器去找施工队(相当于new 施工队),等待地基(相当于外部资源)注入到建房子当中。
 
5. 依赖注入

问题 解答 参与者 自身对象、IOC/DI容器、外部资源 谁依赖谁? 自身对象依赖于IOC/DI容器 谁注入谁? IOC/DI容器注入自身对象 注入的是什么? 注入的是自身对象所需要的外部资源

6. IOC和DI是同一个概念吗?
 依赖注入和控制反转在一般情况下来讲是一样的,他们是对一件事物的不同角度来说明这件事。依赖注入:偏向于应用程序的角度,自身对象依赖容器创建并注入所自身对象需要的外部资源。控制反转:偏向于容器的角度,由容器反向地向自身对象注入自身对象所需要的外部资源。

7. 对编程 思想上有何影响?
 本来一直以自身对象为中心,需要什么对象(外部资源)就自己new,掌握着主动权。但是IOC思想使得自身对象不再是中心,变成被动的,等待需要的外资源注入。有效地分离了自身对象和外部资源的松散耦合,提高了整个体系结构的灵活性。
8. 实际的应用体现
 通过引入IOC/DI容器,由容器进行管理对象的生命周期、对象依赖等关系,使得应用程序的配置和依赖规范性与实际的应用程序代码分开。通过文本的配置文件来完成应用程序之间的依赖配置,不用再去修改源代码。

 因为把对象生成放在了XML里定义,所以当我们需要换一个实现子类将会变成很简单(一般这样的对象都是现实于某种接口的),只要修改XML就可以了。

原创粉丝点击