要想弄懂控制反转和依赖注入首先要想明白的事

传统应用程序(程序员)和对象的关系
控制:应用程序直接控制对象,程序员 new 对象
正转:应用程序主动控制获取依赖的对象

谁控制了谁,谁反转了谁,谁依赖了谁,谁又注入了谁
控制:IoC 容器控制应用程序的对象
反转:IoC 容器创建应用程序的对象、注入应用程序依赖的对象
依赖:应用程序依赖于 IoC 容器
注入:IoC 容器注入应用程序需要的对象

为什么要用控制反转和依赖注入
解耦。
举个简单的例子有三个类 Banana 类、Apple 类和 Pear 类实现了 Fruit 接口

传统方式:
现在有需求要创建 banana 对象
Fruit fruit = new Banana();
需求变更,要求创建 Apple 对象
你需要修改 java 源代码才能完成需求,Fruit fruit = new Apple();
但修改源代码的代价十分高昂。

Spring方式(工厂模式):
<bean id="fruit" class="com.demo.ioc.Banana"></bean>
只需要修改配置文件为<bean id="fruit" class="com.demo.ioc.Apple"></bean>
不需要修改 java 源代码。

控制反转

控制反转是 spring 框架的核心,所谓控制反转,就是将原本程序员创建对象、管理对象的过程交给 spring 容器来管理,而程序员本身不再使用 new 来创建对象。

Spring 中的 IoC 容器一共有两个 BeanFactory 和 ApplicationContext 。
BeanFactory 是 Spring 最简单的容器,它提供了 Spring 框架的基本功能。
ApplicationContext 容器添加了更多企业级功能,因为 ApplicationContext 接口继承了 BeanFactory接口,所以它包括了 BeanFactory 的所有功能。

注意:IoC 容器不仅仅只能创建对象,还包括管理对象的依赖关系、生命周期等。


依赖注入

所谓依赖注入,就是由容器动态的将某个依赖关系注入到组件之中。即为正在运行的应用程序的对象动态的提供它所依赖的对象。
依赖注入的目的主要是为了提升组件重用的频率,为应用程序提供一个灵活、可扩展的平台