Spring的循环依赖是Spring容器注入时候的问题,表现形式之一为多个Bean相互依赖,比如A依赖B,B依赖C,C又依赖A,形成闭环
Spring使用三级缓存来解决循环依赖问题
Spring一级缓存存放完成Bean实例,二级缓存存放早期的Bean(还未赋值属性初始化方法),三级缓存存放Bean工厂以及生成代理对象
1、BeanA实例化还没完成属性set和方法初始化,创建BeanA工厂放到3级缓存
2、注入BeanB的时候发现一二三级缓存中都没有BeanB,实例化BeanB并且创建BeanB工厂放入三级缓存
3、发现BeanB需要注入A对象,将三级缓存中的对象A放入二级缓存并且删除三级缓存中的对象A并且注入A对象到自己的属性
4、BeanB完成属性填充执行初始化方法,放入一级缓存并且删除二级缓存中的对象B
5、二级缓存中的BeanA获取到了实例BeanB进行属性填充和方法初始化,放入一级缓存删除二级缓存的BeanA
如果我们的程序出现多次循环依赖问题的话,要先看看我们的编码逻辑有没有问题,编码OK的话审查一下模块之间的关系以及系统架构的一个设计是否存在不合理的地方,尽快优化改进