一分钟总结Spring的IOC和DI

IOC Inverse of control 控制反转 

IoC(控制反转)就是将程序中原来 new 对象,交给spring创建,从spring工厂获取对象,使用spring来负责控制对象的生命周期和对象间的关系.

Spring所倡导的开发方式——所有的类都会在spring容器中登记,告诉spring你是个什么东西,你需要什么东西,然后spring会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转。

IOC是什么 用的目的 什么是控制反转(举例:生活中、代码)

IOC是控制反转,主要用于:1、对象创建 2、依赖管理 目的就是为了解耦合,使代码具有更高的扩展性和维护性。

什么是控制反转?

控制反转是一种通过描述(XML或注解)并通过第三方生产或获取特定对象的方式。

在传统模式中,对象由程序员主动创建,控制权在程序员手中。如果用户需求变更,程序员就要修改对应的代码,,修改一次需求,或多或少会造成代码的修改,这个问题就是耦合性过高引起的。

IoC的主要思想是借助一个“第三方”来拆开原本耦合的对象,并将这些对象都与“第三方”建立联系,由第三方来创建、操作 这些对象,进而达到解耦的目的。

IoC的思想最核心的地方在于,资源不由使用资源的双方管理,而由不使用资源的第三方管理,

生活中:1. 如共享单车 只拥有他的使用权,而不是所有权

2. 如你把买房子的需求交给房产中介 而不是自己搭建 控制权在房产中介手上(控制反转),而建房子的开放商是服务提供者,房产中介根据需求把房子提供给小明,就是依赖注入

3.如在相亲网站 也是提需求 相亲网站按照你的要求给你找对象

正转: 如拥有所有权 直接耦合 A类使用B类 A类创建B类对象

反转:A类使用B类的步骤:Spring管理B类对象 A类找Spring要B类对象,B类对象的所有权属于Spring A类只拥有使用权 对B类的控制权交给Spring

那么到底是“哪些方面的控制被反转了呢?”

获得依赖对象的过程被反转了”。控制被反转之后,获得依赖对象的过程由自身管理变为了由IOC容器主动注入。

实现IOC的方法:注入。

所谓依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。

DI Dependency Injection 依赖注入

“谁依赖谁,为什么需要依赖,谁注入谁,注入了什么”

  • 谁依赖于谁:当然是应用程序依赖于IoC容器;

  • 为什么需要依赖:应用程序需要IoC容器来提供对象需要的外部资源;

  • 谁注入谁:很明显是IoC容器注入应用程序某个对象,应用程序依赖的对象;

  • 注入了什么:就是注入某个对象所需要的外部资源(包括对象、资源、常量数据)。

IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(依赖注入)来实现的。

比如对象A需要操作数据库,以前我们总是要在A中自己编写代码来获得一个Connection对象,有了spring我们就只需要告诉spring,A中需要一个Connection,至于这个Connection怎么构造,何时构造,A不需要知道。在系统运行时,spring会在适当的时候制造一个Connection,然后像打针一样,注射到A当中,这样就完成了对各个对象之间关系的控制。A需要依赖Connection才能正常运行,而这个Connection是由spring注入到A中的,依赖注入的名字就这么来的。那么DI是如何实现的呢?Java 1.3之后一个重要特征是反射(reflection),它允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性,spring就是通过反射来实现注入的。

IOC和DI的关系


IOC和DI虽然定义不同,但他们所做的事情都是一样的,就是都是用来实现对象解耦的。

不同之处是IOC是一种设计思想,而DI是一种具体的实现技术