spring容器如何解决依赖循环
1.什么是依赖循环(你中有我,我中有你):当我创建A对象时,发现需要用到B对象;然后我去创建B对象,发现需要用到A对象,但此时A对象还木有创建完成,那么问题来了,到底是先创建A对象还是B对象?(ps:回忆下对象的创建过程:https://www.cnblogs.com/LearnSB/p/13191418.html)
2.springIOC容器工厂是如何解决依赖循环的:我们可能遇到过以下的场景,在不知不觉间就使用了依赖循环;
@Service
public ServiceA{
@Autowired
private ServiceB b;
}
@Service
public ServiceB{
@Autowired
private ServiceA a;
}
上面的代码其实就存在依赖循环,只不过由spring容器在创建bean的过程中就解决掉了;那么springIoc是如何解决的?
其实任何事物都有先后顺序,springIoc的‘提前曝光原则’(名字我瞎起的哈)恰好解决了这种看似无解的问题;
ps:回忆朴实无华创建对象三部曲:https://www.cnblogs.com/LearnSB/p/13191418.html
springIoc容器工厂创建对象利用了三个map,对应了常说的三级cache,如下:
1)singletonObjects
2)singletonFactories
3)earlySingletonObjects
’提前曝光原则‘就是:A先去创建对象,创建到第二步骤发现需要用到B对象,A首当其冲先将自己暴露(设置是否可以访问的标志位allowEarlyReference ),然后再去获取B,B在第一步骤就发现需要用到A...由于之前A对象已经暴露,虽然还不完整,但是已经可以访问了(earlySingletonObjects),所以此时B对象率先完成创建;随之A对象也可完成创建;
总结一下:谁先有需求,谁就先暴露自己,但是后完成;(ps:有点像LIFO原则)
参考文档:https://blog.csdn.net/csdnlijingran/article/details/86617958
https://blog.csdn.net/fedorafrog/article/details/104550165/