1、什么是控制反转(Ioc)
Ioc 是 Inversion of Control 的缩写,译为“控制反转”,还有的译为“控制反向”或者“控制倒置”。
在面向对象传统编程方式中,获取对象的方式通常是用new关键字主动创建一个对象。Spring中的Ioc方式对象的生命周期由Spring框架提供的Ioc容器来管理,直接从Ioc容器中获取一个对象,控制权从应用程序交给了Ioc容器。
Ioc理论上是借助于“第三方(代理)”实现具有依赖关系对象之间的解耦。即把各个对象类封装之后,通过Ioc容器来关联这些对象类。这样对象与对象之间就通过Ioc容器进行联系,而对象与对象之间没有直接联系。
应用程序在没有引入Ioc容器之前,对象A依赖对象B,那么A对象在实例化或者运行到某一点的时候,自己必须主动创建对象B或者使用已经创建好的对象B,其中无论是创建还是使用已创建的对象B,控制权都在应用程序本身。如果应用程序引入了Ioc容器之后,对象A和对象B之间失去了直接联系,那么当对象A实例化和运行时,如果需要对象B,Ioc容器就会主动创建一个对象B注入(依赖注入)到对象A所需要的地方。由此,对象A获得依赖对象B的过程,由主动行为变成了被动行为,即把创建对象交给了Ioc容器来处理,控制权也就颠倒过来了,这就是所谓的控制反转。
2、什么是依赖注入(DI)
DI 是 Dependency Inject 的缩写,译为“依赖注入”。所谓依赖注入,就是由Ioc容器在运行期间动态地将某种依赖关系注入到对象之中。例如,将对象B 注入(赋值)给对象A的成员变量。
事实上,依赖注入(DI)和控制反转(Ioc)是对同一件事情的不同描述,从某个方面讲,就是它们描述的角度不同。依赖注入是从应用程序的角度来描述,即应用程序依赖容器创建并注入它所需要的外部资源;而控制反转是从容器的角度来描述,即容器控制应用程序,由容器反向地向应用程序注入应用程序所需要的外部资源。(这里说的外部资源可以是外部实例对象,也可以是外部文件对象等)
3、Ioc/DI的实现
Spring框架的主要功能是通过其核心容器来实现的。Spring框架提供的两种核心容器分别是BeanFactory和ApplicationContext。Ioc/DI通常有setter(设置)注入和构造方法注入两种实现方式。