目录
- 一、如何解决循环依赖
- 二、二级缓存能不能解决循环依赖
- 三、多例bean的循环依赖spring是否解决
- 四、构造参数的循环依赖spring是否解决
一、如何解决循环依赖
- 1.通过三级缓存(map)
- 2.一级缓存:存储完整的Bean,(关键是一定要有一个缓存保存它的早期对象作为死循环的出口)
- 3.二级缓存:避免多重循环依赖的情况,重复创建动态代理
- 4. 三级缓存:缓存的是函数接口,通过lambda表达式把方法传进去(把bean的实例和bean的名字传进去)(可能会有aop创建),但不会立即调用(如果在实例化后立即调用,所有aop不管bean是否循环依赖都会在实例化后创建proxy,但spring希望正常bean遵循生命周期,在初始化创建动态代理),第二次getBean的时候才会去调用三级缓存(实现了aop才会创建动态代理,没有实现则返回bean的实例),放入二级缓存(避免被多个依赖而重复创建),并从三级缓存中删除
二、二级缓存能不能解决循环依赖
- 1.如果只是死循环的问题,一级缓存就可以解决,但无法避免在并发下获取不完整的bean
- 2.二级缓存也可以解决循环依赖,但如果出现重复循环依赖,会多次创建aop的动态代理
三、多例bean的循环依赖spring是否解决
- 1.多例bean不会使用到缓存进行存储,因为多例bean每次使用都需要重新创建
- 2.不缓存早期的对象就无法解决循环依赖
四、构造参数的循环依赖spring是否解决
- 1.构造函数的循环依赖没有解决
- 2.可以人工通过@Lazy延迟加载解决,不会立即创建依赖的bean,而是等到用到时才通过动态代理进行创建