文中的内容是根据杨章伟和吴为胜所著的Spring+Spring MVC+MyBatis从零开始学来写的。
1. 什么是控制反转(IOC)
应用程序在没有引入IOC容器之前,对象A依赖对象B,那么A对象在实例化或者运行到某一点的时候,自己必须主动创建对象B或者使用已经创建好的对象B,其中无论是创建还是使用已创建的对象B,控制权都在应用程序自身。如果应用程序引入了IOC容器之后,对象A和对象B之间失去了直接联系,那么当对象A实例化和运行时,如果需要对象B,IOC容器就会主动创建一个对象B注入(依赖注入)到对象A所需要的地方。由此,对象A获得依赖对象B的过程,由主动行为变成被动行为,即把创建对象交给了IOC容器处理,控制权颠倒过来了,这就是所谓的控制反转。
2. 什么是依赖注入(DI)
所谓依赖注入,就是由IOC容器在运行期间动态地将某种依赖关系注入对象之中。例如,将对象B注入(赋值)给对象A的成员变量。
依赖注入(DI)和控制反转(IOC)是对同一件是请的不同描述,只是它们描述的角度不同。
3. 使用IOC/DI的好处
(1) 可维护行比较好,便于单元测试、调试程序和诊断故障。代码中的每一个Class都可以单独测试,彼此之间互不影响,只要保证自身的功能无误即可,这就是组件之间低耦合或者无耦合的好处。
(2) 可复用性好,我们可以把具有普遍性的功能独立出来,反复应用的项目中的其他部分,这是面向对象的基本特征。显然,IOC更好地贯彻了这个原则,提高了模块的可复用性。符合接口标准的实现都可以插接到支持此标准的模块中。
(3) 生成对象的方式转为外置方式,就是把对象生成放在配置文件中进行定义。这样,当我们更换一个实现子类将会变得很简单,只要修改配置文件就可以了,完全具有热插拔的特性。
4. IOC/DI的实现
Spring框架的主要功能是通过其核心容器来实现的。Spring框架提供的两种核心容器分别是BeanFactory和ApplicationContext。IOC/DI通常有setter(设置)注入和构造方法注入两种实现方式。
4.1. setter()方法注入
属性setter()方法注入:IOC容器使用setter()方法注入被依赖的实例。通过调用无参构造器或无参静态工厂方法实例化Bean后,调用该Bean的setter()方法,即可实现基于setter()方法的依赖注入。该方法简单、直观,容易理解。
4.2. 构造方法注入
构造方法注入:IOC容器使用构造方法注入被依赖的实例。基于构造方法的依赖注入通过调用戴灿灿数的构造方法来实现,每个参数代表着一个依赖。