如果你还不了解ioc和aop建议先看我上一篇博客 先弄清楚ioc、aop、生命周期底层再来看三级缓存会简单很多
接下来是我们先来看循环依赖问题
下面来看看如果只有二级缓存的情况
这是只有一二级缓存的情况 可以看到第三列返回的是普通对象 可是如果a需要aop代理 我们应该返回的是代理对象而不是普通对象
那我们有没有什么办法让二级缓存在需要代理的时候返回代理对象 不需要返回代理的时候返回普通对象呢 有的兄弟有的 我们只需要在二级缓存下再增加一个三级缓存用于判断bean是否需要代理 如果需要 则往二级缓存中返回代理对象 不需要则返回普通对象 然后根据二级缓存解决依赖注入就可以了
三级缓存objectfactory当中有一个getobject方法 它有一个判断逻辑 用于判断当前bean是否需要代理 根据判断结果来决定是否需要创建代理对象以及要往二级缓存中放什么 而且三级缓存可以延迟代理产生的时间
如果只有二级缓存 也就是一级缓存存完整的bean 二级缓存存实例化但未初始化好的bean(有可能是代理对象) 但是spring不知道bean是否需要代理就会给所有的bean都创建代理 这不太现实 所以就需要加一个三级缓存执行判断逻辑
那有的小伙伴就要问了 为什么不能直接在二级缓存上加判断逻辑呢 因为这样会破坏bean的生命周期 代理最好在初始化后通过beanpostprocessor生成 如果只有二级缓存那假设没有产生循环依赖的问题 代理对象是不是也提前生成了呢 这样就导致所有需要代理的对象在没有循环依赖的问题的情况下都破坏了bean的生命周期 所以需要三级缓存来在有循环依赖的问题的情况下判断向二级缓存返回什么对象(尽管这也破坏了bean的生命周期但只是在产生循环依赖的情况下 顺便说一下通过 ObjectFactory 提前触发代理生成 底层仍由BeanPostProcessor完成) 而循环依赖是怎么发现的呢 就是通过正在创建中的bean的集合singletonsCurrentlyInCreation来发现的