一.什么是Spring循环依赖?
Spring循环依赖就是多个bean之间存在直接或者间接的依赖关系,这种依赖关系构成了环形调用。
循环依赖分为多例模式下的循环注入,单例模式下的setter注入,单例模式下的构造器注入。
二.Spring是如何解决循环依赖问题的?
首先说一下SpringBean的生命周期,Spring程序在启动的时候会对Bean进行一个反射的实例化,然后进行属性注入,然后再初始化,最后才是Spring容器关闭的时候会把Bean销毁。
实例化-属性赋值-初始化-销毁
Spring只解决了单例模式下的属性循环依赖问题。Spring为了解决循环依赖问题使用了三级缓存。
一级缓存(singletonObjects):单例对象缓存池,已经实例化并且所有属性已经赋值填充,是成熟的对象。
二级缓存(earlySingletonObjects):单例对象缓存池,已经实例化但是没有进行属性赋值,属于半成品对象。
三级缓存(singletonFactories):存放单例Bean的工厂对象。
Spring首先从一级缓存singletonObjecs中获取,如果获取不到,而且对象正在建立中,则从二级缓存earlySingletonObjects中获取。如果仍然获取不到,且允许singletonFactories经过getObject()获取,就从三级缓存singletonFactory.getObject()中获取,或是获取到了则从三级缓存移动到二级缓存,然后进行初始化,初始化过后会存到一级缓存。