学习Spring IOC,看完这篇就够了
说明
官网
介绍了控制反转(IOC)原理的Spring框架实现。IoC也称为依赖注入(DI)。在此过程中,对象仅通过构造函数参数,工厂方法的参数或在构造或从工厂方法返回后在对象实例上设置的属性来定义其依赖项(即,与它们一起使用的其他对象) 。然后,容器在创建bean时注入那些依赖项。此过程从根本上讲是通过使用类的直接构造或诸如服务定位器模式之类的机制来控制其依赖项的实例化或位置的bean本身的逆过程(因此称为Control Inversion)。说完IOC的基本概念,就不能离开IOC所管理的对象——Bean进行讨论了。
这个图很形象的说明获得依赖对象的过程被反转了。
Bean 定义
- Id
- Class
- Scope
- Constructor arguments
- Properties
- Autowiring mode
- lazy-initialization mode
- initialization/destruction method
Id和Class这里不做解释说明,必须得保证项目内唯一,不然启动会报出。
Scope 作用域
- singleton:单例,指一个Bean容器中只存在一份。默认情况都是单例模式。针对此情况可以进行池化管理封装,达到快速响应。
池化的目的是提升对象复用率和定制化封装,适用于10w级以上的并发请求。
prototype:多例,每次从容器中获取的对象都是新的。单例和多例可以根据对象的哈希值【haseCode】查看。通过注解形式注入的对象,都是单例。
request:每次http请求创建一个实例仅在当前request内有效
session、global session:同上
Constructor arguments 构造器注入
Properties 设值注入
Autowiring mode 自动装配模式
Bean 生命周期
- 初始化
- 赋值
- 调用
- 销毁
这里引申出问题一:相互依赖的Bean是如何进行初始化的?
如果没有处理好,会抛出循环依赖的问题。
Bean在实例化过程中,需要调用自身的构造器进行初始化,然后对成员变量进行赋值。
成员变量赋值有两种形式
- 构造器注入
- 设值注入(我们常用的通过Set方法注入)
对于相互依赖的Bean进行实例化的话,就不能通过构造器注入。
问题二:如何保证Bean在整个容器是唯一的
这里使用到了单例模式中的双重锁模式
Bean 装配
分为自动转配和手动装配
通过使用注解或是XML的形式进行装配
这里不做过多的阐述
说点和面试相关
除了向面试官阐述大家都知道的依赖注入和控制反转,你还可以说下和Bean相关的知识点。和IOC所相关的是Bean,包括以下几个知识点,感兴趣的可以看下源码或是官网
- Bean 定义
- Bean 生命周期
- Bean 装配
还可以引申出
- Bean 池化处理
- Bean 创建过程
- Bean 相互依赖
- 容器的三级缓存