Spring的核心依赖注入(DI)和控制反转(IOC)
Spring-core
Spring的核心模块是一个容器,通过IOC或DI的方式来管理实例
Spring将每个实例都看作是一个bean对象,通过工厂模式来创建对象,将创建的对象保存在IOC容器中,当需要使用到这个对象时通过getBean()方法来获取该对象,并且对象是以单例的形式存在
容器的工作模式
- 接口ApplicationContext在工程启动时读取resources下的.xml文件,获取需要管理的bean实例
- 通过bean工厂来创建需要管理的bean实例
- 业务调用时通过getBean方法从工厂中获取需要的实例来调用目标方法
- 容器中管理的bean实例默认是单例
控制反转(IOC)
为什么有控制反转
控制反转是为了降低对象间的耦合度的
我们及所涉多用到的对象之间相互依赖,类似于齿轮一样,一旦一个崩溃,整个系统都会崩溃
而IOC相当于一个第三方进行协调,齿轮之间不再相互依赖,而是都依赖于第三方
为什么叫控制反转
- 举个栗子:根据图1可知,A工作的完成依赖于B,那么A在初始化或者运行到某个状态节点的时候,发现需要使用到B,A就要主动的去创建B或使用已被创建的B,无论是创建还是使用B,控制权都在A这里
- 而在引入了IOC后,当A需要B时,A告知“第三方”,那么第三方就会去主动创建一个B注入到A所需要的地方
- 对比两个过程,可以发现,A获得B的过程,在第二个中从主动变成了被动,创建B的控制权在IOC手中,也就是控制反转了
依赖注入(DI)
什么是依赖
以上图中的图1为例进行解释,A的运行需要使用到B,那么我们就说A依赖于B
什么是依赖注入
依旧以上图中的图1为例进行解释,A依赖于B,但A并不主动创建依赖,而是通过外部传入对象的形式来设置依赖
主要有三种方式构造器注入 setter方法注入 接口注入
以下代码截图来自技术小黑屋
在Spring中,是使用依赖注入的方式外部传入依赖的,那么是谁创建的依赖呢,对了,是Spring的IOC容器
IOC和DI
IOC和DI实际上描述的是同一件事情(对象实例化及依赖关系维护),并为的是同一个目的(降低程序耦合度),只是两者的角度不同
- IOC站在对象的角度,容器进行对象实例化和管理实例
- DI站在容器的角度,使容器将对象依赖的其他对象注入
- IOC是一种解耦合的思想,而DI是这种思想的一种实现方式,是一个涉及模式