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多线程实现的两种方式:继承Thread类、实现Runnable接口。具有一定的参考价值,下面跟着小编一起来看下吧
    2017-01-01
  • 使用Netty进行编解码的操作过程详解

    使用Netty进行编解码的操作过程详解

    这篇文章主要介绍了使用Netty进行编解码的操作过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • Redisson分布式锁的源码解读分享

    Redisson分布式锁的源码解读分享

    Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。Redisson有一样功能是可重入的分布式锁。本文来讨论一下这个功能的特点以及源码分析
    2022-11-11
  • Maven  pom.xml与settings.xml详解

    Maven pom.xml与settings.xml详解

    这篇文章主要介绍了Maven pom.xml与settings.xml详解的相关资料,这里对pom.xml与setting.xml详细的研究说明,需要的朋友可以参考下
    2016-12-12
  • java实现八皇后问题示例分享

    java实现八皇后问题示例分享

    这篇文章主要介绍了java实现八皇后问题示例,八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出
    2014-03-03
  • SpringBoot 整合mapstruct的实现步骤

    SpringBoot 整合mapstruct的实现步骤

    这篇文章主要介绍了SpringBoot整合mapstruct,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • java基础之泛型知识点总结

    java基础之泛型知识点总结

    这篇文章主要介绍了java基础之泛型知识点总结,文中有非常详细的代码示例,对正在学习java基础的小伙伴们有很好的帮助,需要的朋友可以参考下
    2021-04-04
  • springboot项目突然启动缓慢的解决

    springboot项目突然启动缓慢的解决

    这篇文章主要介绍了springboot项目突然启动缓慢的解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Java 中向 Arraylist 添加对象的示例代码

    Java 中向 Arraylist 添加对象的示例代码

    本文介绍了如何在 Java 中向 ArrayList 添加对象,并提供了示例和注意事项,通过掌握这些知识,读者可以在自己的 Java 项目中有效地使用 ArrayList 来存储和操作对象,需要的朋友可以参考下
    2023-11-11
  • Java中关键字final finally finalize的区别介绍

    Java中关键字final finally finalize的区别介绍

    这篇文章主要给大家分享的是 Java中final,finally,finalize 到底有什么区别,文章围绕final,finally,finalize的相关资料展开详细内容,具有一定的参考的价值,需要的朋友可以参考一下
    2022-04-04

最新评论