spring使用三级缓存解决循环依赖的情况

 更新时间:2025年09月10日 09:40:26   作者:java叶新东老师  
Spring 2.6后默认禁用循环依赖,启动时报错;可通过@Lazy注解或配置启用,三级缓存分别存储完整Bean、部分注入对象和未注入对象,解决依赖注入问题

前言

在spring 2.6之前的版本中,默认都是支持循环依赖的,也就不会报错,在2.6版本之后默认禁用了循环依赖;可通过以下方式开启循环依赖

spring:
  main:
    allow-circular-references: true # 开启循环依赖, false (默认)表示禁用循环依赖

复现

比如有以下2个类,A引用了B,B引用了A;

  • A.java
@Service
public class B{
 @Autowried
  private B b;
}
  • B.java
@Service
public class B{
 @Autowried
  private A a;
}

默认情况下启动spring就会抛出循环依赖的异常

***************************
APPLICATION FAILED TO START
***************************

Description:

The dependencies of some of the beans in the application context form a cycle:

┌─────┐
|  a (field private com.spring.service.B com.spring.service.A.b)
↑     ↓
|  b (field private com.spring.service.A com.spring.service.B.a)
└─────┘


Action:

Relying upon circular references is discouraged and they are prohibited by default. Update your application to remove the dependency cycle between beans. As a last resort, it may be possible to break the cycle automatically by setting spring.main.allow-circular-references to true.

三级缓存

先说下三级缓存的作用

  • 一级缓存:存放实例化且属性已注入完成的Bean(完整对象)
  • 二级缓存:存放不完整的对象(属性已注入了一部分,未全部注入完成)
  • 三级缓存:存放刚实例化的空对象(属性未注入)

  • 三级缓存的执行流程如下:

解决

这里有2种解决方案

1、添加懒加载注解 @Lazy

用法如下

@Service
public class B {

    @Autowired
    @Lazy
    private A a;
}

2、启用循环依赖的配置

在application.yml 文件加上以下配置即可

spring:
  main:
    allow-circular-references: true

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java线程池配置原则与实战解析

    Java线程池配置原则与实战解析

    本文详细介绍了Java线程池的配置原则和实战建议,主要内容包括核心参数解析、任务类型配置、等待队列选择策略、行业实践参考、配置步骤和检查清单、SpringBoot配置示例以及黄金法则是,感兴趣的朋友跟随小编一起看看吧
    2025-12-12
  • Java concurrency集合之CopyOnWriteArraySet_动力节点Java学院整理

    Java concurrency集合之CopyOnWriteArraySet_动力节点Java学院整理

    CopyOnWriteArraySet基于CopyOnWriteArrayList实现,其唯一的不同是在add时调用的是CopyOnWriteArrayList的addIfAbsent(若没有则增加)方法
    2017-06-06
  • Java实现随机验证码功能实例代码

    Java实现随机验证码功能实例代码

    在这里,我们使用servlet来实现随机验证码的实现,有需要的朋友可以参考一下
    2013-08-08
  • Spring-data-JPA使用时碰到的问题以及解决方案

    Spring-data-JPA使用时碰到的问题以及解决方案

    这篇文章主要介绍了Spring-data-JPA使用时碰到的问题以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • java实现切割wav音频文件的方法详解【附外部jar包下载】

    java实现切割wav音频文件的方法详解【附外部jar包下载】

    这篇文章主要介绍了java实现切割wav音频文件的方法,结合实例形式详细分析了java切割wav音频文件的相关原理、操作技巧与注意事项,并附带外部jar包供读者下载,需要的朋友可以参考下
    2019-05-05
  • SpringBoot请求发送与信息响应匹配实现方法介绍

    SpringBoot请求发送与信息响应匹配实现方法介绍

    这篇文章主要介绍了SpringBoot请求发送与信息响应匹配实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-10-10
  • Springboot基于websocket实现简单在线聊天功能

    Springboot基于websocket实现简单在线聊天功能

    这篇文章主要介绍了Springboot基于websocket实现简单在线聊天功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • Java的Spring框架中DAO数据访问对象的使用示例

    Java的Spring框架中DAO数据访问对象的使用示例

    这篇文章主要介绍了Java的Spring框架中DAO数据访问对象的使用示例,分为在Spring中DOA与JDBC以及与Hibernate的配合使用两种情况来进行演示,需要的朋友可以参考下
    2016-03-03
  • SSM 整合的配合文件(分享)

    SSM 整合的配合文件(分享)

    下面小编就为大家分享一篇SSM 整合的配合文件,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • Mybatis-Plus最优化持久层开发过程

    Mybatis-Plus最优化持久层开发过程

    Mybatis-plus(简称MP)是一个Mybatis的增强工具,在mybatis的基础上只做增强不做改变,提高效率,自动生成单表的CRUD功能,这篇文章主要介绍了Mybatis-Plus最优化持久层开发,需要的朋友可以参考下
    2024-07-07

最新评论