Spring使用三级缓存来解决循环依赖问题。三级缓存包括singletonObjects、earlySingletonObjects和singletonFactories。
1. 当Spring创建一个Bean时,会先将Bean放入singletonFactories缓存中。
2. 接着,Spring会实例化该Bean,并将其放入earlySingletonObjects缓存中。
3. 然后,Spring会对该Bean的依赖进行注入,如果发现依赖的Bean也在创建中,就会从singletonFactories缓存中获取该Bean的代理对象,而不是直接使用该Bean。
4. 最后,Spring会将该Bean放入singletonObjects缓存中,并从earlySingletonObjects缓存中移除该Bean。 如果在上述过程中发生了循环依赖,Spring会抛出BeanCurrentlyInCreationException异常。为了解决这个问题,可以使用构造函数注入代替Setter方法注入,或使用@Autowired注解的required属性设置为false,以允许循环依赖的Bean为null。