首先咱们先来了解一下什么是IOC(Inversion of Control)
IOC(Inversion of Control):控制反转。它是Spring最核心的部分,也是任意组件的基本,但是,这并不算是一种技术,而是一种思想,它可以让你从繁琐的对象嵌套中解锁出来,更进一步突出面向对象,但是在了解IOC之前,我们应该先来了解一下Dependency Inversion,也就是依赖注入。
给依赖注入举一个例子:设计行李箱。
我们可以看出这四个是互相依赖的关系,可以看出它们是逐步依赖的关系,也就是说,如果底层需要改,那么全局就都得需要改,但是这么看还是不形象,所以来换代码来理解一下:
也就是说,如果我们想要改底层一个逻辑,那么所有依赖于这个底层的所有的类和方法都会出bug。
于是就出现了DI(依赖注入),也就是让上层结果决定下层设计,来避免不可维护的错误。
这么写了以后,我们就可以在new的时候,定制出自己心仪的类了。
同时,可以从下图来看出IOC与DI的关系,我们也可以看出,不光DI可以实现Spring IOC,DL也是可以的,也就是通过官方封装的api和配置来实现控制反转,但是DL已经抛弃了,因为具有侵入性。
我们也可以从图中看出,有以下几种方法来实现DI:
- Setter
实现特定属性的public setter方法,可以让IOC容器去调用所依赖生成类型的对象。
- Interface
也就是去实现特定的接口来注入对象的属性,实现IOC
- Constructor
也就是基于构造函数,在创建对象的时候,让IOC注入所依赖类型的对象。
- Annotation
也就是基于注解的实现IOC
然后再来理解一下依赖倒置原则,IOC,DI和IOC容器之间的关系:
依赖倒置原则就是说,高层模块不应该依赖于低层对象,应该去依赖其抽象。也正是有了这个思想,才有了IOC,而IOC又是需要容器的,实现方法,也就是DI。
IOC容器的优点如下:
- 这个容器可以自动对代码进行初始化,只需要维护一个Configuration,可以是xml,也可以是代码,而不是每次去初始化一个Configuration。
- 在创建一个对象的时候,不需要考虑其细节 。
如果我们没有IOC,则需要在每一步new的时候都考虑配置和构造函数是怎么定义的。
但是我们有了IOC之后,它是从最上层开始向下找依赖关系,然后通过我们的Configuration来获取配置,减少了代码量。