Spring源码解析(五) 解决循环依赖问题
前言
什么是依赖注入?
1 |
|
如上代码,A和B相互依赖对方
- 注入A对象的时候发现需要B对象,那就先去注入B对象
- 注入B对象的时候发现需要A对象,那就先去注入A对象
- 注入A对象的时候发现需要B对象,那就先去注入B对象
- 注入B对象的时候发现需要A对象,那就先去注入A对象
… 不断循环导致注入失败。
解决方案
一句话回答如何解决循环依赖:Spring解决循环依赖的核心思想在于提前曝光
创建Bean的时候将流程分为两步走,先实例化再初始化只实例化没有初始化的叫半成品(放置在二级缓存**
earlySingletonObjects
)反之则是完成品(放置在一级缓存singletonObjects
**)。A注入对象时遇到依赖其他属性先到完成品池子寻找对象,没有则去半成品池子,半成品也没有则创建一个半成品。A对象注入时先不考虑属性完成与否,先将属性逐个注入,保证自己是个完成品并放置到一级缓存,然后B对象依赖A属性时直接从一级缓存取出即可。
这个机制的一个前提:无论怎么填充属性,对象的内存地址是不会改变的。
- 本文标题:Spring源码解析(五) 解决循环依赖问题
- 本文作者:SunRan
- 创建时间:2022-01-25 11:09:22
- 本文链接:https://lksun.cn/2022/01/25/Spring源码解析-五-解决循环依赖问题/
- 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
评论