Spring支持所有循环依赖的情况吗?

简介: 循环依赖的情况如下:构造器循环依赖(singleton,prototype)Setter注入循环依赖(singleton,prototype)

对于prototype来说,Spring是不支持相关的循环依赖的


观察doGetBean源码:


19.png


解决循环依赖的关键在于单例的三级缓存,三级缓存还保证了取出的bean的唯一性,所以三级缓存支持不了prototype



因为没有设置三级缓存进行支持:


只能通过将Bean名字放入缓存里阻断无限循环

Spring只支持Singleton的setter循环依赖,即@Autowired形式,不支持构造器注入的循环依赖。



构造器注入:


@Autowired
public Company(Staff staff){this.staff = staff;}


对于setter形式的注入,会来到doCreateBean的


20.png


先将属性还没赋值的bean实例放入到三级缓存里,再调用


populateBean(beanName, mbd, instanceWrapper);


注入里面的属性;但对于构造器方式来讲,不会等到populateBean才注入,而是在前面的


instanceWrapper = createBeanInstance(beanName, mbd, args);


创建bean实例的时候时就创建出来的,此时还没缓存循环引用的另一个对象。


进入到createBeanInstance里,带参的构造函数的装配的位置


21.png


由于构造函数的参数实例并没被创建出来,在这个地方又会调用getBean尝试创建实例B,此时B的构造方法又需要A实例,就会造成上面doGetBean里抛异常。

相关文章
|
12天前
|
人工智能 Java Spring
Spring Boot循环依赖的症状和解决方案
Spring Boot循环依赖的症状和解决方案
|
2月前
|
XML 缓存 Java
Spring源码之 Bean 的循环依赖
循环依赖是 Spring 中经典问题之一,那么到底什么是循环依赖?简单说就是对象之间相互引用, 如下图所示: 代码层面上很好理解,在 bean 创建过程中 class A 和 class B 又经历了怎样的过程呢? 可以看出形成了一个闭环,如果想解决这个问题,那么在属性填充时要保证不二次创建 A对象 的步骤,也就是必须保证从容器中能够直接获取到 B。 一、复现循环依赖问题 Spring 中默认允许循环依赖的存在,但在 Spring Boot 2.6.x 版本开始默认禁用了循环依赖 1. 基于xml复现循环依赖 定义实体 Bean java复制代码public class A {
|
8天前
|
存储 缓存 Java
【Spring系列笔记】依赖注入,循环依赖以及三级缓存
依赖注入: 是指通过外部配置,将依赖关系注入到对象中。依赖注入有四种主要方式:构造器注入、setter方法注入、接口注入以及注解注入。其中注解注入在开发中最为常见,因为其使用便捷以及可维护性强;构造器注入为官方推荐,可注入不可变对象以及解决循环依赖问题。本文基于依赖注入方式引出循环依赖以及三层缓存的底层原理,以及代码的实现方式。
20 0
|
12天前
|
存储 缓存 Java
【spring】06 循环依赖的分析与解决
【spring】06 循环依赖的分析与解决
7 1
|
19天前
|
存储 缓存 Java
Spring解决循环依赖
Spring解决循环依赖
|
1月前
|
缓存 算法 Java
开发必懂的Spring循环依赖图解 Spring 循环依赖
开发必懂的Spring循环依赖图解 Spring 循环依赖
22 1
|
2月前
|
缓存 算法 Java
Spring解决循环依赖
Spring解决循环依赖
20 1
|
2月前
|
Java 开发者 Spring
【Java】Spring循环依赖:原因与解决方法
【Java】Spring循环依赖:原因与解决方法
44 0
|
2月前
|
Java 数据库连接 Spring
Spring Boot 3.2.2整合MyBatis-Plus 3.5.5依赖不兼容问题
Spring Boot 3.2.2整合MyBatis-Plus 3.5.5依赖不兼容问题
61 0
|
2月前
|
消息中间件 运维 监控