IOC代表的是Inversion of Control即控制反转,常常有人把它等价于依赖注入,我觉得这是不恰当的。
一、为什么使用依赖注入
假设我们设计一辆汽车:先设计轮子,然后根据轮子大小设计底盘,接着根据底盘设计车身,最后根据车身设计好整个汽车。这里就出现了一个“依赖”关系:汽车依赖车身,车身依赖底盘,底盘依赖轮子。
对应的我们可以理解为如下代码:
上层类依赖于下层类的构造函数,因为我们每次都在上层类中实例化一个下层类。考虑到这样一种情况,如果我们修改Tire的构造函数,变为动态的制造不同尺寸的轮子,则变为:
造成牵一发而动全身的影响,这时候我们如果只是在上层类中传入下层类的引用而不去具体的创建实例,则变为
,这样的话,我们如果要修改轮子的大小,只需要new 对应的Tire就行了,而不必使每个上层类都随之而变化。这就相当于我通过依赖注入的方式实现了控制反转。我上层类需要变需求,只需要修改对应的下层类就行了。
这里我们采用了构造函数的方式来进行依赖注入,常用的还可以使用setter方法和接口传递的方法
二、什么是IOC容器
我们将这些new的代码都交给容器来实现,免去了我们大量new的手工操作,容器会递归的寻找依赖关系,并进行依赖注入。
这里,IOC容器就像一个工厂,隐藏了具体的创建实例的细节,我们完全不用关心它的底层类到底是怎么实现的。
网友评论