1、Spring循环依赖产生的原因
循环依赖:一个或多个对象实例之间存在直接或间接的依赖关系,这种依赖关系构成了构成一个环形调用。
简单点来说,就是a的实例化需要b的依赖注入,b的实例化也需要a。这样 就会导致a需要b,b需要a的这么一种尴尬场面,可以联想一下并发中的死锁。
2、spring能够解决的循环依赖的情况
单例模式的Setter注入
解决方式为三级缓存
三级缓存用于保存bean创建工厂,在后续有需要做代理时使用
二级,存储实例对象(未完成依赖注入)
一级,存储完成依赖注入的实例对象
综上,其实解决单例setter注入的循环依赖时,是将创建对象,与依赖注入的两件事情分开做了,当需要创建这个bean时,首先先将其工厂放到三级中,然后去寻找依赖,当这个依赖的创建循环到自己时,可以直接将三级中存储的取出来,虽然它现在只是个空壳,没有内部的依赖注入,但因为是单例,操作来操作去,a还是只有那个a,所以可以解决循环依赖问题。
3、spring解决不了的循环依赖情况
1、多例模式的setter注入(原因是多例处理不了)
2、构造器的注入方式(原因是拆不开)
3、DependOn的依赖方式