目录
- Spring 如何解决 bean 的循环依赖?
- 什么是 AOP?Spring 如何实现的?
- BeanFactory 和 ApplicationContext 有什么区别?
- 介绍一下 Spring bean 的生命周期
- Spring 的隔离级别
- Spring 框架用到了哪些设计模式?并举出典型例子
Spring 如何解决 bean 的循环依赖?
Spring中引入三级缓存是为了解决循环依赖问题。循环依赖是指在创建bean的过程中,存在两个或多个bean相互依赖的情况,形成一个闭环。这样的情况下,如果没有合适的机制来解决循环依赖,会导致bean的创建陷入死循环,最终导致应用程序无法启动或抛出异常。
三级缓存是Spring用来处理循环依赖的特殊机制,其原理如下:
-
第一级缓存(singletonObjects):当Spring创建一个bean时,会先检查是否有其它的实例正在创建中(即是否在第二级缓存
earlySingletonObjects
中),如果是,则返回尚未填充属性的实例。如果没有,则创建一个"空壳"(即一个空的bean实例),将其放入第一级缓存singletonObjects
中,并继续创建bean的其他依赖。 -
第二级缓存(earlySingletonObjects):当创建bean时,如果发现依赖的其他bean正在创建中(即已经在第一级缓存
singletonObjects
中),则将正在创建的bean放入第二级缓存earlySingletonObjects
中,作为一个尚未填充属性的实例。 -
第三级缓存(singletonFactories):当创建bean时,如果发现依赖的其他bean还未创建完成(即还没有放入第一级缓存
singletonObjects
中),则将创建bean所需的ObjectFactory放入第三级缓存singletonFactories
中。
通过这三级缓存的机制,Spring能够在创建bean的过程中解决循环依赖问题。当遇到循环依赖时,Spring会提前暴露正在创建的bean对象,然后继续创建其他依赖的bean,最终再回过头来填充这些“空壳”,从而解决了循环依赖的问题。
需要注意的是,三级缓存主要用于解决单例作用域的bean的循环依赖问题,对于原型作用域的bean,Spring无法解决循环依赖。