循环依赖问题
一个bean的创建分为如下步骤:
当创建一个简单对象的时候,过程如下:
- 先从单例池中获取bean,发现无 a
- 创建 a 的实例
- 为 a 赋值
- 把 a 放到单例池中
当创建一个对象并且其中有另外一个对象是就变成了这样:
但是当在B对象中由引用了A对象,就会变成这样:
因为A和B两者相互引用,但是单例池中始终无法创建任一对象,所以会出现死循环。
因此,我们需要添加一个半成品池,先把A初始化出来,放到一个半成品池中。
过程如下:
- 先从单例池中找A对象,没有则开始创建A对象
- 实例化A对象,并放入半成品池中
- 为A对象赋值
- 赋值时发现引用了B对象 --> 实例化B对象,并放入半成品池中
- 为B对象赋值
- 赋值时发现引用了A对象,从单例池中和半成品池中找A对象,并将其赋值
- 实例化B对象,并放入单例池中
- 实例化A对象,从半成品池中移除A对象,并放入单例池中