当前位置: 首页 > 网络应用技术

春季使用第三级缓存来解决周期依赖关系

时间:2023-03-07 13:06:17 网络应用技术

  Spring使用三级缓冲区设计来解决单个模式下属性周期依赖性问题。

  有两点要注意这句话

  Spring Bean的生命周期可以简单地总结为4个阶段

  如上面的代码所示,即A注入B中,并且B注入了A。在此点,发生了“圆形依赖性”。

  在春季,创建后,将在IOC容器的高速缓存池中放置一个case bean,并触发Spring的生命周期管理。

  在一个示例中,首次使用bean时,将创建一个bean对象并将其放入IOC容器的缓存池中。遵循bean对象的遵循-up,将直接从缓存池中获得。

  保存单模式bean的高速缓存池,该bean使用三级高速缓存设计,如以下代码所示。

  存储存储的商店的第一层高速缓存对象缓存池具有实例化,属性分配,完整的初始化(成品产品)CACHE早期单碎饼干高速缓存池的第二层。Method(半生产产品)第三个缓存单工厂

  方法

  可以看到整个分析过程

  春季解决周期依赖性的技巧在于这三个级别的缓存。该接口在第三级缓存中使用,定义如下

  在建立BEAN期间,有两个重要的匿名内部类来实现接口。春季使用BEAN的建立时,另一个是该方法中的方法,如以下代码所示。

  这是解决周期依赖性的关键。此代码将来发生

  根据本章的存在,与循环依赖性案例相结合,以分析如何使用三级缓存来求解单壳bean的圆形依赖性。

  为什么春季不能解决非单星豆的圆形依赖性?这个问题可以细分为以下问题

  物体的构造函数在实例化阶段调用。

  如上所述,在实例化对象后,对象将存放到第三个级别的缓存中。当调用对象的构造函数时,尚未初始化对象,因此该对象不能存储在第三个级别中缓存。

  在注入构造函数中,对象A需要完成对象B的构造函数中的初始化,并且对象B也需要完成对象的构造函数中的初始化。。最终结果是两者都无法完成初始化,也无法解决循环依赖性问题。

  弹簧IOC容器仅管理单箱豆的生命周期,并将单打豆存储在缓存池中(第三级高速缓存)。Spring不能管理范围的bean,也不会缓存bean bean范围和弹簧中循环依赖性的溶液是通过缓存实现的。

  Multi -incance bean每次调用都会创建一个新的bean对象,该对象无法缓存。弹簧中循环依赖性的解决方案是通过缓存实现的。

  为什么我必须缓存三个?我可以用两个级别的缓存解决周期依赖关系吗?

  有了这个想法,请在下面输入。

  第三级缓存的目的是延迟代理对象的创建,因为如果没有周期的依赖性,则它无需提前创建代理,直到初始化完成之前,该代理可以延迟创建。

  由于目的仅限于延迟,我们不能延迟创建,而是在实例化完成后为其创建代理对象,因此我们不需要第三级的缓存。因此,我们可以转换该方法。

  在这种情况下,在检查每个实例后,直接转到创建代理对象并将其添加到辅助缓存中。

  测试结果完全正常。弹簧的初始化时间不应产生太大影响,因为如果bean本身不需要是代理,它将直接返回到原始的bean,也无需遵循代理bean复杂创建的过程。

  测试证明了次要缓存也可以解决周期依赖性。为什么不选择辅助缓存,而是添加额外的缓存层以使用第三级缓存?

  如果Spring选择第二级高速缓存来求解周期依赖性,则意味着所有BEAN都需要在实例化完成后立即创建代理。春季的设计原理是在豆初始化后为其创建一个代理。

  使用第三级缓存而不是辅助缓存不是因为第三级缓存可以解决周期参考问题。实际上,第二个级别的缓存也可以解决周期参考的问题。第三级而不是次级缓存的使用不是为了考虑IOC的考虑,而是考虑到AOP,也就是说,如果第二个级别的缓存为使用的是,它在AOP情况下被注入其他bean,而不是最终代理对象,而是原始对象。

  原始:https://juejin.cn/post/7099745254744474212