剑指Offer(Spring)——SpringIOC原理

首先咱们先来了解一下什么是IOC(Inversion of Control)

IOC(Inversion of Control):控制反转。它是Spring最核心的部分,也是任意组件的基本,但是,这并不算是一种技术,而是一种思想,它可以让你从繁琐的对象嵌套中解锁出来,更进一步突出面向对象,但是在了解IOC之前,我们应该先来了解一下Dependency Inversion,也就是依赖注入。

给依赖注入举一个例子:设计行李箱。

在这里插入图片描述
我们可以看出这四个是互相依赖的关系,可以看出它们是逐步依赖的关系,也就是说,如果底层需要改,那么全局就都得需要改,但是这么看还是不形象,所以来换代码来理解一下:

在这里插入图片描述

也就是说,如果我们想要改底层一个逻辑,那么所有依赖于这个底层的所有的类和方法都会出bug。

于是就出现了DI(依赖注入),也就是让上层结果决定下层设计,来避免不可维护的错误。

在这里插入图片描述
在这里插入图片描述
这么写了以后,我们就可以在new的时候,定制出自己心仪的类了。

同时,可以从下图来看出IOC与DI的关系,我们也可以看出,不光DI可以实现Spring IOC,DL也是可以的,也就是通过官方封装的api和配置来实现控制反转,但是DL已经抛弃了,因为具有侵入性。

在这里插入图片描述

我们也可以从图中看出,有以下几种方法来实现DI:

  1. Setter

实现特定属性的public setter方法,可以让IOC容器去调用所依赖生成类型的对象。

  1. Interface

也就是去实现特定的接口来注入对象的属性,实现IOC

  1. Constructor

也就是基于构造函数,在创建对象的时候,让IOC注入所依赖类型的对象。

  1. Annotation

也就是基于注解的实现IOC

然后再来理解一下依赖倒置原则,IOC,DI和IOC容器之间的关系:

依赖倒置原则就是说,高层模块不应该依赖于低层对象,应该去依赖其抽象。也正是有了这个思想,才有了IOC,而IOC又是需要容器的,实现方法,也就是DI。

在这里插入图片描述

IOC容器的优点如下:

  1. 这个容器可以自动对代码进行初始化,只需要维护一个Configuration,可以是xml,也可以是代码,而不是每次去初始化一个Configuration。
  2. 在创建一个对象的时候,不需要考虑其细节 。

如果我们没有IOC,则需要在每一步new的时候都考虑配置和构造函数是怎么定义的。
在这里插入图片描述
但是我们有了IOC之后,它是从最上层开始向下找依赖关系,然后通过我们的Configuration来获取配置,减少了代码量。

发布了296 篇原创文章 · 获赞 53 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_41936805/article/details/103466697
今日推荐