学习地址:https://www.bilibili.com/video/BV1ET4y1N7Sp?p=2
1、什么是Spring循环依赖?
2、循环依赖怎么解决?
3、Spring中为什么要使用三级缓存来解决循环依赖?二级缓存能不能解决循环依赖问题?
什么是Spring循环依赖
首先了解Bean的创建与管理过程:
结论:获取Bean的时候先从单例池中获取,如果没有则创建并添加到单例池。
获取Bean
找bean工厂,调用两次单例池。第一次通过beanName获取,如果单例池中并没有这个beanName的对象,则第二次会使用工厂模式创建并且添加到单例池中然后返回需要的对象。
加锁是因为在并发的情况下,防止重复创建Bean。
创建Bean
通过getBean(" ")触发。
单例情况下:
多例情况下:
Bean的生命周期(创建过程):getBean->实例化->填充属性->初始化,对应以下步骤:
getBean("a");
createBeanInstance("a"); //实例化
populateBean("a"); //填充属性(成员属性)
initializeBean("a"); //初始化
创建完成之后添加到单例池中:
循环依赖怎么解决?
这是包含一般属性的对象创建过程,如果对象A属性中包含对象B,那么就是以下情况:
看另外一种情况:
半成品池:存储还没有初始化的bean对象
如果仅仅是以上的情况,可以通过二级缓存解决。
Spring中为什么要使用三级缓存来解决循环依赖?二级缓存能不能解决循环依赖问题?
但是还有另外的情况,就是AOP,被代理的对象进行循环引用就要用到三级缓存+提前引用。