文章更新时间:2020/11/3

一、IOC(控制反转)

定义:反转控制 (Inversion Of Control)的缩写,即创建对象的反转控制

 正向控制:若要使用某个对象,需要自己去负责对象的创建。

 反向控制:若要使用某个对象,只需要从 Spring 容器中获取需要使用的对象,不关心对象的创建过程,也就是把创建对象的控制权反转给了Spring框架。

例子:在现实生活中,人们要用到一样东西的时候,第一反应就是去找到这件东西,比如想喝新鲜橙汁,在没有饮品店的日子里,最直观的做法就是:买果汁机、买橙子,然后准备开水。

  值得注意的是:这些都是你自己“主动”创造的过程,也就是说一杯橙汁需要你自己创造。

  然而到了今时今日,由于饮品店的盛行,当我们想喝橙汁时,第一想法就转换成了找到饮品店的联系方式,通过电话等渠道描述你的需要、地址、联系方式等,下订单等待,过一会儿就会有人送来橙汁了。

  值得注意的是:你并没有“主动”去创造橙汁,橙汁是由饮品店创造的,而不是你,然而也完全达到了你的要求,甚至比你创造的要好上那么一些。

二、DI的方式

  首先,DI的方式一般有三种:

  • 构造器依赖注入:构造器依赖注入通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖。【在构造方法的入参中设置需要注入的对象】
  • Setter方法注入:Setter方法注入是容器通过调用无参构造器或无参static工厂方法实例化bean之后,调用该bean的setter方法,即实现了基于setter的依赖注入。
  • 接口注入:需要实现某一个用于注入对象的接口,该接口定义有注入对象的方法,方法参数就是需要被注入的对象。

  PS:接口注入的方式比较繁琐且侵入性强【需要实现一些不必要的接口】,用得很少,了解就好。

构造器注入

使用方式:在构造方法中声明需要注入的对象,构造方法的参数列表就是需要注入的对象列表。 

  优点:对象在构造完成即进入就绪状态。

  缺点:当依赖对象比较多时,构造方法的参数列表会比较长,不好维护。

Spring学习(二)Spring IoC 和 DI 简介_构造器

setter方法注入

使用方式:在类中增加需要被注入对象的getter/setter方法。

 优点:使用起来更宽松,需要什么对象就调用其对应的setter方法。

缺点:构造完成后不能立即使用,需要先调用依赖对象的setter方法进行依赖注入。

Spring学习(二)Spring IoC 和 DI 简介_构造器_02

三、IOC容器对bean的管理  

PS:客户端对象:如果A引用B,则A称为B的客户端对象,而不管A具体处于哪一个层级。  

  首先我们在上面了解了,我们可以通过控制反转的方式给客户端对象注入其依赖的类对象,那么被注入的对象也一样需要实例化,类似于如下代码:

Spring学习(二)Spring IoC 和 DI 简介_ide_03

   那么我们这里引申出一个概念:

IOC Service Provider

  含义:一种抽象概念,用于业务对象的构建管理业务对象间的依赖绑定

  • 业务对象的构建管理 :在IoC场景中,业务对象无需关心所依赖的对象如何构建如何取得,但这部分工作始终需要有人来做。所以,IoC Service Provider需要将对象的构建逻辑从客户端对象那里剥离出来,以免这部分逻辑污染业务对象的实现
  • 业务对象间的依赖绑定 :对于IoC Service Provider来说,这个职责是最艰巨也是最重要的,这是它的最终使命之所在。如果不能完成这个职责,那么,无论业务对象如何的“呼喊”,也不会得到依赖对象的任何响应(最常见的倒是会收到一个NullPointerException)。IoC Service Provider通过结合之前构建和管理的所有业务对象,以及各个业务对象间可以识别的依赖关系,将这些对象所依赖的对象注入绑定,从而保证每个业务对象在使用的时候,可以处于就绪状态