彻底理解IOC

350 阅读3分钟

前言

IOC 这个词估计是估计接触过spirng的人都知道的,就是所谓的控制反转,主要思想其实就是软件设计思想中的依赖倒置,讲真,我学了java一年多,spring的这个主要特点,ioc看了不少,但是还是没有太明白,就是一直不晓得,在没有ioc之前是怎么会回事儿,没有对比,也不太知道它的优点在哪里。终于在这篇文章中给到我想要的答案。

what

在我的理解中,IOC的核心思想其实就是它的中文翻译过来的意思,控制反转,那么是谁的控制在反转那?
是在new一个对象的时候的反转,用一个非常简单的例子来讲解,你就会明白了。 比如说一台汽车,他是如何设计的那?首先肯定是要画出他的模型,那么一台汽车都有什么部件那?

  1. 车身
  2. 底盘
  3. 轮子 在这里只是将车分为这三部分进行讨论,就这样最终形成一个完整的汽车,这中就有依赖关系,也就是默认的依赖关系是

image.png 这就是所谓的上层依赖下层,下层控制上层的意思。

但是使用了IOC之后那,这类比汽车就是说,给了你一个零件,需要你自己来找其他的零件来组成汽车。步骤应该是:

  1. 首先肯定是考虑自己有了轮胎,那么轮胎要装在哪里那?应该是放在汽车底盘的下方
  2. 有了底盘,汽车肯定是要字载人的,所以要有车身
  3. 有了轮胎 底盘 车身,就可以组装成一辆汽车了

image.png

代码

上面的例子其实我觉得不是特别的恰当,必须要落实到代码当中才可以。 具体的代码,可以到下方的参考链接中进行查看,我这里这是简单的描述IOC前后的差异。 image.png 仔细查看上图,就会发现,其实IOC前后的差距,无非就是你写的是无参构造还是有参构造,看起来是非常细微的差别,但是其实作用相差很多。
当你使用的无参构造的时候,你其实调用的是下面一层的方法,然后每一层都是调用下一层的方法,这样就会出现一个问题,就是当你修改最底层的方法的时候,就需要把涉及到的所有方法都要进行修改,很麻烦。
但是当你使用的是有参构造的时候,你每次一调用的是实例化的对象的方法,所以当你修改最底层的方法的时候,只需要修改那一行代码就可以了,其实就是代码之间的耦合性降低了,使得代码更加易于适应于需求变化的场景。

和new的关系

我的理解是当你使用了ioc之后,你所创建的对象,需要依赖别的对象实现的话(并且这个对象已经注入到sping容器中),就可以进行直接调用,而不是要将所有依赖的对象都new出来。

其实从这里,也可以看出spring中单例模式的作用,其实它就是为这个IOC来进行服务的,因为如果不是因为单例模式,一个对象只有一个实例化,那么spirng容器在调用对应对象的时候就会不知道如何选择,不知道选择哪个对象比较好。

总结

IOC的作用:

  1. 降低耦合度,代码维护更加方便
  2. 资源集中管理,实现资源的可配置和易管理

参考: