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/

 

posted @ 2021-01-22 10:33  LearnSB  阅读(127)  评论(0编辑  收藏  举报