谈谈你对Spring IoC理解【面试】

前言

面试中经常被问到,谈谈你对Spring IoC的理解,初学者可能很难解释清楚,相信看完本篇,将有助于同学们加深理解spring,并且再也不怕面试被问到这个问题了。

1、什么是IoC

IoC即Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。
简单理解:
传统开发中,我们在对象内部通过new关键字,创建依赖的对象,我们主动控制依赖的对象;而IoC有专门一个容器来创建依赖对象,对象内部只是被动的接受这些依赖的对象。
上面就解释了“控制反转”:依赖对象的获取给反转了。之前,依赖对象由对象内部主动创建获取,现在,依赖对象由容器创建,对象从容器中获取依赖对象。

2、什么是DI

IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(Dependency Injection,依赖注入)来实现的。
简单理解:
A对象需要一个B对象的依赖,以前,我们需要编写代码手动构建B对象,有了DI(依赖注入),我们不需要构建B对象、何时构建,Spring会在合适的时候注入B对象,完成各个对象之间的控制。

3、Spring容器的设计

对于 IoC 来说,最重要的就是容器,容器管理着 Bean 的生命周期,控制着 Bean 的依赖注入。Spring中设计了两个接口来表示容器,分别是BeanFactory、ApplicationContext。
BeanFactory: BeanFactory可以理解为就是个 HashMap,Key 是 BeanName,Value 是 Bean 实例。通常只提供注册(put),获取(get)这两个功能。
ApplicationContext: ApplicationContext比 BeanFactory 多了更多的功能,比如:资源的获取,支持多种消息等,该接口定义了一个 refresh 方法,此方法是所有阅读 Spring 源码的人的最熟悉的方法,用于刷新整个容器,即重新加载/刷新所有的 Bean。

4、IoC的初始化过程

本段落只以文字的形式进行大纲说明,有兴趣的同学可以对照源码进行对照分析

  1. Resource定位;指对BeanDefinition的资源定位过程。通俗地讲,就是找到定义Javabean信息的XML文件,并将其封装成Resource对象。
  2. BeanDefinition的载入;把用户定义好的Javabean表示为IoC容器内部的数据结构,这个容器内部的数据结构就是BeanDefinition。
  3. 向IoC容器注册这些BeanDefinition。

5、DI的注入过程

Spring IoC容器的整个启动过程,仅仅是BeanDefinition的载入和注册,Javabean之间的依赖关系,在调用 getBean 的时候,进行真正的依赖注入,有的同学会问,为什么不在载入的时候就注入?
假设,有Bean_A对象依赖Bean_B对象,因为加载的顺序不同,很可能 Bean_A 依赖的 Bean_B 还没有加载好,也就无法从容器中获取,所以如果 Bean 有依赖关系,则使用占位符暂时代替,在调用 getBean 的时候,才将依赖的对象真正的注入。
因此,Spring 将其分为了 2 个步骤:

  1. 加载所有的 Bean 配置成 BeanDefinition 到容器中,如果 Bean 有依赖关系,则使用占位符暂时代替。
  2. 在调用 getBean 的时候,进行真正的依赖注入,即如果碰到了属性是 ref 的(占位符),那么就从容器里获取这个 Bean,然后注入到实例中 —— 称之为依赖注入。

结束语

看完这篇文章,下次如果再有面试官问 Spring IoC,上面五点,你能脱口而出吗?

原创文章 55 获赞 76 访问量 17万+

猜你喜欢

转载自blog.csdn.net/cool_summer_moon/article/details/105920473