循环依赖
什么是循环依赖
循环依赖其实就是循环引用,也就是两个或则两个以上的bean互相持有对方,最终形成闭环。比如A依赖于B,B依赖于C,C又依赖于A。
spring三级缓存
众所周知 一般我们都会将对象交给spring管理,那么对象在spring中是如何存储的呢? 答案是对象存在于spring的map结构中
| 等级 | 名称 | 特点 |
|---|---|---|
| 一级缓存 | singletonObjects | 初始化完成的对象,可以直接使用 |
| 二级缓存 | earlySingletonObjects | 提前暴露在缓存中,属性没有填充 |
| 三级缓存 | singletonFactories | 获取代理对象 |
对象的创建过程
- 查询缓存
第一次创造A对象时会先从缓存中查找,如果查找不到则进行创造对象 - 创建对象
java会通过反射创造出 Factory类型的A 并存入三级缓存中。 - 填充属性
由于A对象的属性是B对象,所以A对象的填充属性这一步需要进行B对象的以下几步- 查询缓存
- 创建对象 : 将Factory类型的B放入三级缓存中
- 填充属性
由于B对象的属性是A对象,所以这里会进行查询缓存(如果缓存中没有,就是创建对象等一套流程),此时在三级缓存中查到了A,接着将真正的A对象放入二级缓存中,并删除三次缓存中的A,接着将A对象填充到B对象的属性,就完成了B对象的属性填充
- 初始化 : @PostConstruct就是在这里执行的
- 缓存转移 : 初始化完成后 删除二,三级缓存中的B,并将B添加到以及缓存中
- 初始化
- 缓存转移 :初始化完成后 删除二,三级缓存中的A,并将A添加到以及缓存中
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Little Monste'Blog!
评论






