JAVA面试题学习7 - SpingBean循环依赖如何解决

发布时间:2026/7/26 22:20:23

JAVA面试题学习7 - SpingBean循环依赖如何解决 问题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 创建动态代理的逻辑放入三级缓存中当出现循环依赖时调用三级缓存生成动态代理对象 并放入二级缓存。

相关新闻