产品经理

循环依赖

2021-03-14  本文已影响0人  Andy的故事

循环依赖是个典型的问题,我们看下在spring中是如何解决的

class A{    private B b;}

class B{    private A a;}

这个我们先分析一下bean在实例化过程中的几个阶段

①获取bean对应class的定义---获取A的class定义

②通过构造函数来反射生成对象---生成A对象

③设置对应的属性---设置B属性,又走一遍①②③步骤,这是就发生了循环引用

那我在第②步的时候设置一下缓存不就行了,等到第③步中实例化B对象需要A对象时,直接从缓存里面拿到A对象的引用就行了

这个里面只涉及到二级缓存,

一级:完整实例化对象的缓存(spring中的singletionObjects)

二级:未填充属性的实例化的对象的缓存(spring中的earlySingletionObjects)

我们看了下spring中,用到了三级缓存,为什么要用到三级缓存呢?

还是看看三级缓存里面存放的是什么

三级:未填充属性的实例化的原类对象的缓存 或者  未填充属性的实例化的原类的代理对象(singletionFactories)

主要是对AOP的处理(BeanPostProcessor)

个人理解:不一定对

        ①其实通过一级和二级缓存也是可以的,只不过在实例化的过程就要真实的处理AOP

        ②而spring对bean的生命周期的管理,是在实例化之后才进行AOP的处理,如果不采用三级缓存,那么对bean生命周期的管理就不统一了

以上属个人观点,欢迎大家讨论,随着理解的加深,可能会有更有说服力的结论给出

上一篇下一篇

猜你喜欢

热点阅读