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里抛异常。

相关文章
|
4天前
|
人工智能 Java Spring
Spring Boot循环依赖的症状和解决方案
Spring Boot循环依赖的症状和解决方案
|
4天前
|
缓存 Java 开发工具
【spring】如何解决循环依赖
【spring】如何解决循环依赖
14 0
|
4天前
|
存储 缓存 Java
【Spring系列笔记】依赖注入,循环依赖以及三级缓存
依赖注入: 是指通过外部配置,将依赖关系注入到对象中。依赖注入有四种主要方式:构造器注入、setter方法注入、接口注入以及注解注入。其中注解注入在开发中最为常见,因为其使用便捷以及可维护性强;构造器注入为官方推荐,可注入不可变对象以及解决循环依赖问题。本文基于依赖注入方式引出循环依赖以及三层缓存的底层原理,以及代码的实现方式。
24 0
|
4天前
|
存储 缓存 Java
【spring】06 循环依赖的分析与解决
【spring】06 循环依赖的分析与解决
9 1
|
4天前
|
存储 缓存 Java
Spring解决循环依赖
Spring解决循环依赖
|
4天前
|
缓存 算法 Java
开发必懂的Spring循环依赖图解 Spring 循环依赖
开发必懂的Spring循环依赖图解 Spring 循环依赖
22 1
|
4天前
|
缓存 算法 Java
Spring解决循环依赖
Spring解决循环依赖
21 1
|
Java 关系型数据库 MySQL
06_spring_ 依赖注入| 学习笔记
快速学习 06_spring_ 依赖注入
|
4天前
|
Java 应用服务中间件 Maven
SpringBoot 项目瘦身指南
SpringBoot 项目瘦身指南
60 0
|
4天前
|
缓存 安全 Java
Spring Boot 面试题及答案整理,最新面试题
Spring Boot 面试题及答案整理,最新面试题
142 0