spring是使用三级缓存解决单例模式下的循环依赖,依赖注入时首先去单例池找,在创建时是找不到的所以会去二级缓存找,二级缓存如果找不到就会去三级缓存找,这里三级缓存是一定能找到的。
在一级缓存找不到时会去判断当前这个对象是不是在创建中,如果是就是产生了循环依赖,从二级缓存中找如果二级缓存找不到就去三级缓存找,三级缓存是在bean生命周期实例化时就放进去的所以一定能找到,找到了就remove掉自己put放到二级缓存中。
一级缓存:其实就是springbean的单例池,getbean都是去这个map里拿
二级缓存:用来存放没有经过完整的生命周期的bean对象,其实存放的就是三级缓存执行lambda表达式返回的对象
三级缓存:用来存放原始对象/代理对象的lambda表达式,这个lambda是一段逻辑用来判断当前对象是否需要aop,需要aop生成的就是代理对象了,这个lambda表达式在存二级缓存时执行。
spring无法解决的循环依赖问题
1:原型bean这种方法无法解决循环依赖问题
2:开启异步无法解决循环依赖问题(可自己通过@lazy解决)
3:构造方法入参方式无法解决循环依赖问题