问题1:什么是依赖注入和控制反转
对象依赖:有A类,B类,在A类中B类以形参的方式作为A类中的某个方法的参数,这个时候我们就可以认为A类B类是相互依赖的,即A类依赖于B类,当然在Java,C++中体现为:局部变量、方法/函数的参数或者是对静态方法的调用。1.Java应用程序,通过各个对象协助组成,对象彼此之间相互
依赖
,这种方式缺乏将基本构建块组织成一个连贯的整体的方法(图1)。
相关学习链接:
Java语言中的关联与依赖关系
java对象间的关系(依赖,关联,组合,聚合)
Spring如何解决循环依赖问题
2.Spring 框架控制反转(IoC)组件通过提供一种形式化
的方法来将不同的组件
组成一个可以正常使用的应用程序,从而解决了这一问题(图2)。
3.Ioc
也称为依赖注入(DI)
,这是一个过程,在此过程中,对象通过构造函数参数,工厂方法的参数或在对象实例从工厂方法构造或返回后设置的属性来定义其依赖关系即与它们一起使用的其他对象。然后,容器
在创建Bean时注入那些依赖项。
回答上面的问题什么是控制反转和依赖注入:
下面的内容来源于:【第二章】 IoC 之 2.1 IoC基础 ——跟我学Spring3
4.控制反转
Ioc—Inversion of Control,即“控制反转
”,不是什么技术,而是一种设计思想
。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。
对于控制反转你需要搞懂以下三个问题:
4.1 谁控制谁
传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象,这时候就是程序控制对象
。
而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对象的创建,这时候就是Ioc容器控制对象
。
4.2 控制什么
主要控制了外部资源获取
(不只是对象包括比如文件等)。
4.3 正转和反转:
正转
:传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,对象主动接受依赖对象,也就是正转
反转
:由容器来帮忙创建及注入依赖对象,对象被动的接受依赖对象,所以是反转
5.依赖注入
DI—Dependency Injection,即“
依赖注入
”:是组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。
对于依赖注入你需要搞懂以下四个问题:
5.1 谁依赖于谁
谁依赖于谁:当然是应用程序依赖于IoC容器;
5.2 为什么需要依赖
应用程序需要IoC容器来提供对象需要的外部资源;
5.3 谁注入谁
很明显是IoC容器注入应用程序某个对象,应用程序依赖的对象;
5.4 注入了什么
就是注入某个对象所需要的外部资源(包括对象、资源、常量数据)
最后对于控制反转和依赖注入我觉得狂神的理解方式挺不错的:
关于本部分的代码实例,你可以通过这篇博文进一步加深印象:Spring-IOC本质