JAVA面试题学习7 - SpingBean循环依赖如何解决
2026/7/26 22:20:04 网站建设 项目流程

问题

SpingBean循环依赖如何解决

解答

产生原因

当 Spring 容器加载时,会进行创建 Bean,令该 Bean 为 A,在 A 创建过程中,会进行实例化 -> 属性赋值(依赖注入,@Autowired)-> 加入一级缓存(beanName-bean对象映射) 的过程,若 A 在属性赋值时依赖了 B 对象,它会调取 getBean 方法,若 B 没有被创建它会对 B 进行一次创建过程,若此时 B 依赖注入时 又 依赖了 A 对象,由于 A 没有创建成功,它又会执行一次 A 的创建流程,导致死循环。

解决方式

一级缓存

在实例化时后,就将 Bean 对象放入一级缓存,这样其他 Bean 就能获取到当前 Bean 对象,结束死循环。

问题:一级缓存中混入了不完整 Bean 对象(没有属性赋值) 和 完整 Bean 对象,在多线程情况下,其他线程可能会获取到不完整的 Bean 对象

二级缓存

在实例化时后,就将 Bean 对象放入二级缓存,若一级缓存获取不到就获取二级缓存。

问题:如果 A 使用了 AOP,会在属性赋值之后进行动态代理,将动态代理的 A 放入一级缓存中,而二级缓存中只存储了普通 Bean 对象,导致引用出错。
如果将 AOP 放在实例化之后写入二级缓存理论可行,但破坏了 Spring 生命周期规范(坚持绝大部分Bean必须在初始化后才能生产代理)

三级缓存

在实例化后,将 AOP 创建动态代理的逻辑放入三级缓存中,当出现循环依赖时,调用三级缓存生成动态代理对象 并放入二级缓存。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询