springbean的循环依赖的解决
spring解决bean的循环依赖结合springbean的生命周期一起理解。
spring bean的生命周期getbean()
例子bean A依赖bean B,bean B依赖bean A。
一 先获取bean A
{
1.1 getBean A
1.2 doGetBean A
1.3 获取早期对象 getSingleton A,第一次没有A的早期对象。
1.4 createBean
1.5 doCreateBean{
1.5.1 创建bena实例
1.5.2 暴露早期对象,这个时候有A的早期对象了。
1.5.3 属性填充,这个时候会发现依赖了bean B,去getBean B,执行完getBeanB之后完成属性填充。
1.5.4 初始化bean A
}
返回A
}
二 getBean B
{
2.1 getBean B
2.2 doGetBean B
2.3 获取早期对象 getSingleton B,第一次获取B,还没有B的早期对象。
2.4 createBean B
2.5 doCreateBean B {
2.5.1 创建bean实例
2.5.2 暴露B的早期对象
2.5.3 属性填充,发现依赖了A,去getBean A,第二次获取A可以拿 到一个早期对象A。属性填充完毕,往下走。
2.5.4 初始化beanB
}
2.6 返回创建好的B
}
完成步骤一、步骤二 解决了循环依赖
不能解决循环依赖的场景
- 构造方法注入
spring暴露早期对象是在实例化之后才暴露的,构造方法注入的方式会在实例化的时候就发现了依赖,但是这时候还没有早期对象。所以,构造方法注入造成的循环依赖不能被解决。 - bean多例模式
多例模式都没有缓存,也不能被解决。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。