1. 面向对象中对象的关系?
在面向对象中,对象的关系有:依赖、继承、聚合(分为聚集和组合)。我们重点讲什么叫依赖。举个例子:老师让课代表收作业。老师要完成这一个事情,必须得有课代表才行,在这边的关系就是老师依赖课代表。
2. IOC和DI的具体概念
IOC(Inverse of control)控制反转:将自身对象需要的外部资源进行控制反转,反转后自身对象不再持有外部资源的创建控制,而是由第三方对外部资源进行创建控制,然后再注入自身对象需要的资源。
概括上来讲,凡是自己用的资源(通常是对象)不是自己准备的(比如主动创建这个对象),自己做的事情还受别人影响的都称之为IOC。
DI(Dependency Injection)依赖注入:自身对象需要的资源,这些需要的资源都是以注入的方式进行注入到自身对象当中。
概括上来讲,自身对象所需要的属性或资源由别人设置。所以DI是IOC中的一种,而AOP就是不是DI的一种IOC。
3. 控制反转
问题 | 解答 |
---|---|
参与者有哪些? | 有三个,自身对象,IOC/DI容器和外部资源 |
谁控制谁? | IOC/DI对象控制自身对象 |
控制的是什么? | 控制的是自身对象的实例创建 |
我们通过画图来进行具体问题的分析:
传统思想:
因为建房子需要打地基,所以为了完成这个任务,就将建房子和找施工队打地基这件事自己都做了。控制权都掌握在自己手中。在这当中,建房子就相当于自身对象,而打地基就相当于是外部资源。
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就可以了。