Spring中的循环依赖问题介绍及解决方法
2016-06-05 10:32
986 查看
Spring容器能顺利的实例化以构造函数注入方式配置的bean有一个前提:即bean构造函数入参引用的对象必须已经准备就绪。
那么如果两个bean都采用构造函数注入,并且都通过构造函数入参引用了对方。就会发生类似与线程死锁的循环依赖问题。
那么接下来我们看一个发生循环依赖问题的例子:
可以看到在Car类中的构造函数中引入了Boss类对象,而在Boss类的构造函数当中引入了Car类。
看一下相应的配置文件:
这种情况下,Spring容器无法成功启动。
这种情况的解决方式便是:
调整配置文件,将构造函数注入方式改为属性注入方式即可。
那么如果两个bean都采用构造函数注入,并且都通过构造函数入参引用了对方。就会发生类似与线程死锁的循环依赖问题。
那么接下来我们看一个发生循环依赖问题的例子:
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类。
看一下相应的配置文件:
<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容器无法成功启动。
这种情况的解决方式便是:
调整配置文件,将构造函数注入方式改为属性注入方式即可。
相关文章推荐
- Java多线程(一)
- worldwind java对WMS/WMST服务的支持
- java文件路径怎么写 /和\\都可以
- JAVA_OA(bug篇)(一):SpringMVC的bug1
- Spring学习(十七)Spring 参数注入方式介绍
- java实现登陆界面
- java多线程ReentrantLock、sync、ReentrantReadWriteLock性能比较
- 【DAY13】JAVA第十三天I/O学习笔记
- java多线程——同步与锁
- java学习Class动态加载
- JAVA多线程之生产者消费者模型
- java2
- java
- Spring学习(十六)Spring Bean内容模型介绍
- 【java并发】线程同步工具Semaphore的使用
- java学习:基于Java构建微服务
- 内省(Introspector)操作JavaBean的属性
- 2016年团体程序设计天梯赛-初赛 - 后天 - Java
- 2016年团体程序设计天梯赛-初赛 - 奇偶分家 - Java
- 2016年团体程序设计天梯赛-初赛 - 重要的话说三遍 - Java