Spring中的循环依赖问题介绍及解决方法
2018-02-27 18:07
1201 查看
Spring容器能顺利的实例化以构造函数注入方式配置的bean有一个前提:即bean构造函数入参引用的对象必须已经准备就绪。那么如果两个bean都采用构造函数注入,并且都通过构造函数入参引用了对方。就会发生类似与线程死锁的循环依赖问题。那么接下来我们看一个发生循环依赖问题的例子:[java] view plain copy public class Car{
private String brand;
private Boss boss;
public Car(String brand, Boss boss) {
this.brand = brand;
this.boss = boss;
}
}
public class Boss{
private String name;
private Car car;
public Boss(String name, Car car) {
this.name = name;
this.car = car;
}
}
可以看到在Car类中的构造函数中引入了Boss类对象,而在Boss类的构造函数当中引入了Car类。看一下相应的配置文件:[html] view plain copy <bean id="car" class="cn.lovepi.chapter02.reflect.Car">
<constructor-arg index="0" value="红旗CA72"/>
<constructor-arg index="1" ref="boss"/>
</bean>
<bean id="boss" class="cn.lovepi.chapter03.scope.Boss">
<constructor-arg index="0" value="wang"/>
<constructor-arg index="1" ref="car"/>
</bean>
这种情况下,Spring容器无法成功启动。这种情况的解决方式便是:调整配置文件,将构造函数注入方式改为属性注入方式即可。
private String brand;
private Boss boss;
public Car(String brand, Boss boss) {
this.brand = brand;
this.boss = boss;
}
}
public class Boss{
private String name;
private Car car;
public Boss(String name, Car car) {
this.name = name;
this.car = car;
}
}
可以看到在Car类中的构造函数中引入了Boss类对象,而在Boss类的构造函数当中引入了Car类。看一下相应的配置文件:[html] view plain copy <bean id="car" class="cn.lovepi.chapter02.reflect.Car">
<constructor-arg index="0" value="红旗CA72"/>
<constructor-arg index="1" ref="boss"/>
</bean>
<bean id="boss" class="cn.lovepi.chapter03.scope.Boss">
<constructor-arg index="0" value="wang"/>
<constructor-arg index="1" ref="car"/>
</bean>
这种情况下,Spring容器无法成功启动。这种情况的解决方式便是:调整配置文件,将构造函数注入方式改为属性注入方式即可。
相关文章推荐
- Spring中的循环依赖问题介绍及解决方法
- SPRING循环依赖(circular reference)的解决方法
- Spring源码学习--Bean对象循环依赖问题解决(四)
- SPRING循环依赖(circular reference)的解决方法 [转贴]
- 解决spring循环依赖的问题:has been injected into other beans
- spring boot log4j2与三方依赖库log4j冲突无法初始化问题解决方法
- 解决spring循环依赖的问题:has been injected into other beans
- spring 源码探索--单例bean解决循环依赖问题
- Spring 4.2 方法注入解决单例Bean的原型Bean依赖问题
- SPRING循环依赖(circular reference)的解决方法
- struts+spring+hibernate整合问题解决方法 陆续更新中....
- Spring依赖翻转以及注入方法简单介绍
- VC6.0 工程转到VS2008一些问题的描述及解决方法(附有VS2008发布程序介绍)
- Linux软件包依赖问题 及解决方法
- 静态编译libcairo.a的时候遇到的依赖库的问题及解决方法
- 解决Spring定时计划任务重复执行两次(实例被构造两次)问题的方法
- JPA与Spring2.5整合时发生不能创建entityManagerFactory的问题解决方法
- VC6.0 工程转到VS2008一些问题的描述及解决方法(附有VS2008发布程序介绍)
- 解决demo的问题,关于 Play()方法 和 计时器中的死循环问题
- linux:dpkg:依赖关系问题使得 skype 的配置工作不能继续:问题解决方法