编辑
2023-10-27
后端
00
请注意,本文编写于 561 天前,最后修改于 561 天前,其中某些信息可能已经过时。

目录

三级缓存
bean循环依赖

三级缓存

在Spring框架中,存在一个三级缓存的概念,用于缓存Bean的定义和实例。这个三级缓存包括singletonObjects、earlySingletonObjects和singletonFactories。

  1. singletonObjects:这是Spring的一级缓存,用于缓存完全初始化的单例Bean实例。当Spring创建一个单例Bean时,会将其放入singletonObjects缓存中。如果在创建过程中发现该Bean已经存在于缓存中,则直接返回缓存中的实例,而不会再次创建。

  2. earlySingletonObjects:这是Spring的二级缓存,用于缓存提前曝光的早期单例Bean实例。在Bean的创建过程中,如果发现依赖其他Bean的循环引用,Spring会在创建Bean的过程中将其提前曝光,并放入earlySingletonObjects缓存中。这样,即使Bean尚未完全初始化,其他Bean也可以引用到它。

  3. singletonFactories:这是Spring的三级缓存,用于缓存Bean的创建工厂。当创建一个单例Bean时,如果发现该Bean还无法完全初始化,Spring会将其创建Bean的工厂放入singletonFactories缓存中。这样,当其他Bean需要引用该Bean时,可以通过工厂来创建实例。

这个三级缓存的设计主要是为了解决循环引用的问题。在创建Bean的过程中,如果发现循环引用,Spring会提前曝光早期的Bean实例,以便其他Bean可以引用到它。同时,通过缓存Bean的定义和实例,可以提高Bean的创建效率。

bean循环依赖

Spring Bean循环依赖是指两个或多个Bean之间存在相互依赖关系的情况,即Bean A依赖于Bean B,同时Bean B也依赖于Bean A。这种情况下,如果不采取特殊处理,会导致Bean的创建过程出现死循环或无法完成的情况。 Spring通过三级缓存和依赖注入来解决Bean循环依赖的问题,具体步骤如下:

  1. 创建Bean的实例:当Spring创建一个Bean时,会先实例化Bean,但是此时Bean的属性还未进行注入。
  2. 提前暴露Bean:在创建Bean的过程中,如果发现循环依赖,Spring会提前暴露正在创建的Bean实例,但是此时它的属性还未进行注入。
  3. 注入依赖:Spring会通过依赖注入的方式,将其他Bean注入到当前Bean的属性中。
  4. 完成Bean的创建:当Bean的属性注入完成后,Spring会将其标记为已完成状态,并将其放入一级缓存中,以便其他Bean进行引用。 通过这种方式,Spring实现了循环依赖的解决。在创建Bean的过程中,通过提前暴露和属性注入的方式,保证了循环依赖的属性能够正确注入,避免了死循环和无法完成Bean创建的问题。 需要注意的是,Spring对于循环依赖的解决是有限制的:只有单例作用域的Bean才能解决循环依赖,对于原型(prototype)作用域的Bean,Spring无法解决循环依赖。

原文链接https://mp.weixin.qq.com/s/dSRQBSG42MYNa992PvtnJA

本文作者:yowayimono

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!