Spring中的循环依赖问题介绍及解决方法

本文探讨了Spring容器在处理构造函数注入时可能出现的循环依赖问题,通过一个具体例子展示了当两个bean互相依赖对方时如何引发此类问题,并提出了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring容器能顺利的实例化以构造函数注入方式配置的bean有一个前提:即bean构造函数入参引用的对象必须已经准备就绪。
那么如果两个bean都采用构造函数注入,并且都通过构造函数入参引用了对方。就会发生类似与线程死锁的循环依赖问题。
那么接下来我们看一个发生循环依赖问题的例子:
[java] view plain copy
  1. public class Car{  
  2.     private String brand;  
  3.     private Boss boss;  
  4.     public Car(String brand, Boss boss) {  
  5.         this.brand = brand;  
  6.         this.boss = boss;  
  7.     }  
  8. }  
  9. public class Boss{  
  10.     private String name;  
  11.     private Car car;  
  12.   
  13.     public Boss(String name, Car car) {  
  14.         this.name = name;  
  15.         this.car = car;  
  16.     }  
  17. }  
可以看到在Car类中的构造函数中引入了Boss类对象,而在Boss类的构造函数当中引入了Car类。
看一下相应的配置文件:
[html] view plain copy
  1. <bean id="car" class="cn.lovepi.chapter02.reflect.Car">  
  2.     <constructor-arg index="0" value="红旗CA72"/>  
  3.     <constructor-arg index="1" ref="boss"/>  
  4. </bean>  
  5. <bean id="boss" class="cn.lovepi.chapter03.scope.Boss">  
  6.     <constructor-arg index="0" value="wang"/>  
  7.     <constructor-arg index="1" ref="car"/>  
  8. </bean>  
这种情况下,Spring容器无法成功启动。
这种情况的解决方式便是:
调整配置文件,将构造函数注入方式改为属性注入方式即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值