spring IOC源码 – 单实例bean的循环依赖 源码及过程
现在有两个对象Water和Ice,这两个对象相互引用,代码如下: 代码 Ice类 package com.xiaolinzi.cyclicdepen; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; /** * @author :xiaolinzi * @date :2020-4-14 20:46 * @email : [email protected] */ @Component public cl 在Spring框架中,IOC(Inversion of Control,控制反转)是核心特性之一,它负责管理对象的生命周期和依赖关系。当出现循环依赖时,如上述的`Water`和`Ice`两个类,Spring通过一系列复杂但高效的方法来解决。这里我们将深入探讨Spring如何处理这种循环依赖,以及涉及到的关键源码步骤。 1. **初始化过程**: 当我们尝试从ApplicationContext获取`Water`对象时,Spring首先调用`AbstractApplicationContext`的`getBean(Water.class)`方法。此方法进一步调用`BeanFactory`的`doGetBean()`来实例化`Water`。 2. **三级缓存机制**: Spring维护了一个三级缓存,用于存储已创建的bean。首次请求`Water`时,会尝试从`SingletonObjects`(一级缓存)中获取,找不到则会查找`SingletonFactories`(二级缓存)和`EarlySingletonObjects`(三级缓存)。由于是第一次,所以都不会找到`Water`。 3. **创建过程**: 缺少`Water`对象时,Spring调用`DefaultSingletonBeanRegistry`的`getSingleton(beanName, singletonFactory)`。在这里,Spring将`Water`添加到`singletonsCurrentlyInCreation`集合中,表示`Water`正在被创建。 4. **实例化与属性注入**: 随后,Spring执行`AbstractAutowireCapableBeanFactory`的`createBean()`方法。在`doCreateBean()`中,Spring首先通过`createBeanInstance()`创建`Water`的实例,接着将这个早期对象(Eagerly created singleton instance)加入到三级缓存。 5. **属性填充与循环依赖解决**: 在`doCreateBean()`方法的`populateBean()`步骤中,Spring尝试为`Water`的属性赋值。当发现`Water`依赖于`Ice`时,Spring不会立即抛出异常,而是触发对`Ice`的实例化。这个过程中,`Ice`同样会尝试寻找`Water`,但由于`Water`已经在三级缓存中,因此`Ice`能够获取到`Water`的早期对象,从而完成`Ice`的实例化。 6. **结束与注册**: 完成`Ice`的实例化后,`Water`的`populateBean()`继续执行,成功设置`Ice`属性。`Water`对象完成实例化,被添加到一级缓存`SingletonObjects`中。 这个过程中,Spring利用三级缓存和早期对象的概念,巧妙地解决了循环依赖的问题。当遇到依赖时,Spring先创建一个早期对象放入缓存,允许其他依赖它的对象完成实例化,然后再完成自身的完整初始化。这是Spring对单例bean循环依赖的一种有效解决方案,确保了容器中的所有bean都能正确初始化并相互依赖。 了解这个过程,有助于我们在设计和实现Spring应用时避免或处理循环依赖,提高应用的稳定性和效率。同时,也可以帮助我们更好地理解Spring容器的内部工作机制,以便在必要时进行定制和优化。























- 粉丝: 5
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 酒店ITM网络技术大比武题库.doc
- 《软件工程与项目管理》第10章软件项目管理.ppt
- (源码)基于PythonDjango框架的疫情信息综合管理系统.zip
- 价值工程在压力容器制造行业项目管理中的应用.docx
- 《网络安全协议IPSec》教学设计.docx
- 当前计算机辅助教学的实践与思考.docx
- 专升本互联网软件应用与开发模拟试题试卷复习资料.doc
- Asp的求职招聘网站设计方案与开发.doc
- 大数据背景下的税收治理问题.docx
- 安徽专升本安大高升计算机基础提高班测试卷(附标准标准答案).doc
- ASP.NET开发大全第23章.登录模块方案设计书.doc
- 探索党员档案信息化的管理新途径.docx
- 新经济时代云计算下会计信息化的应用.docx
- 对网络安全等级保护设计方案的探讨.docx
- (源码)基于Django框架的智能电表数据采集系统.zip
- 软件工程项目思想——C--面向对象程序设计.doc



评论0