栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

循环依赖的情况如下:

  • 构造器循环依赖(singleton,prototype)
  • Setter注入循环依赖(singleton,prototype)

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


观察doGetBean源码:


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


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

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

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


构造器注入:

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

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

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

populateBean(beanName, mbd, instanceWrapper);

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

instanceWrapper = createBeanInstance(beanName, mbd, args);

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


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

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/591887.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号