手机版 欢迎访问it开发者社区(www.mfbz.cn)网站

当前位置: > 开发

Spring循环依赖

时间:2021/4/12 20:30:41|来源:|点击: 次

Spring循环依赖

  • 学习链接
  • bean的生命周期
  • 循环依赖实例
  • 循环依赖与生命周期
  • 解决循环依赖的过程:三级缓存

学习链接

https://www.yuque.com/renyong-jmovm/kb/dpzl6u

bean的生命周期

在这里插入图片描述

循环依赖实例

在这里插入图片描述

同样的B中有对A的依赖

循环依赖与生命周期

在这里插入图片描述

解决循环依赖的过程:三级缓存

B先取原始对象放进去,完成自己的初始化就打破了循环依赖
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

AOP存入单例池的对象不是new 出来的原始对象,而是经过代理的对象

由上,加一个缓存是不能彻底解决循环依赖的
所以说要有一个单例池,这就是二级缓存

这种就是没有手动注入到第三级缓存而导致循环依赖问题无法彻底解决

一级缓存是最终的单例池

二级缓存:提早生成的单例池
在这里插入图片描述
在这里插入图片描述

为什么要三级缓存ObjectFactory:存的是lambda表达式,也可以说是工厂,只有在产生循环依赖的时候才会去执行存入的工厂,直接生成代理对象
如果判断没有循环依赖也没有AOP,不会出现AOP引起的循环依赖问题,即最终存入的是代理对象而不是初始对象
就不需要执行三级缓存的lambda表达式,这时候的结果就是初始的对象
需要三级缓存的原因:保证只执行一次,防止反复执行工厂表达式。即在B的过程中判断后直接移除表达式,或者执行或者不执行但是一定要取出。因此保证执行一次

二级缓存:
A依赖B,B判断A需要经过AOP,取三级缓存的lambda表达式,生成A的提早暴露版本并放入二级缓存中
后续A再生成最终的资源时,直接取二级缓存结果,进行剩余的属性填充后最终进入一级缓存即可

二级与三级都是在解决循环依赖的时候用到的

Copyright © 2002-2019 某某自媒体运营 版权所有