当前位置: 首页 > wzjs >正文

济南网站建设运营百度首页精简版

济南网站建设运营,百度首页精简版,电商网站界面设计流程,聊城网站推广公司Spring 的三级缓存机制是解决循环依赖问题的核心手段之一。通过三级缓存,Spring 能够在 Bean 的创建过程中提前暴露未完全初始化的 Bean 实例,从而解决单例 Bean 的循环依赖问题。 什么是循环依赖? 循环依赖是指两个或多个 Bean 在初始化时相…

Spring 的三级缓存机制是解决循环依赖问题的核心手段之一。通过三级缓存,Spring 能够在 Bean 的创建过程中提前暴露未完全初始化的 Bean 实例,从而解决单例 Bean 的循环依赖问题。


什么是循环依赖?

循环依赖是指两个或多个 Bean 在初始化时相互依赖。例如:

@Component
public class A {private final B b;public A(B b) {this.b = b;}
}@Component
public class B {private final A a;public B(A a) {this.a = a;}
}

在这种情况下,A 依赖 B,而 B 又依赖 A,导致 Spring 在创建 AB 时陷入死循环。


Spring 的三级缓存

Spring 使用三级缓存来解决循环依赖问题,这三级缓存分别是:

  1. 一级缓存(singletonObjects)

    • 存储已经完全初始化完成的单例 Bean。
    • 当一个 Bean 完全初始化后,它会被放入一级缓存中。
  2. 二级缓存(earlySingletonObjects)

    • 存储提前暴露的、尚未完全初始化的 Bean 实例。
    • 如果某个 Bean 还未完成初始化,但已经被其他 Bean 依赖,Spring 会将它的实例放入二级缓存中。
  3. 三级缓存(singletonFactories)

    • 存储用于创建早期 Bean 实例的工厂对象(ObjectFactory)。
    • 当需要提前暴露一个 Bean 实例时,Spring 会使用三级缓存中的工厂对象来创建该 Bean 的早期引用。

三级缓存的工作原理

以下是 Spring 如何利用三级缓存解决循环依赖问题的详细流程:

1. 创建 Bean A
  • Spring 开始创建 A 的实例。
  • A 的构造器中,发现需要注入 B,因此暂停 A 的初始化,转而开始创建 B
2. 创建 Bean B
  • Spring 开始创建 B 的实例。
  • B 的构造器中,发现需要注入 A
  • 此时,A 还未完全初始化,但 Spring 已经为 A 创建了一个实例(未完成初始化)。
3. 提前暴露 Bean A
  • Spring 将 A 的实例放入三级缓存(singletonFactories)中。
  • 如果其他 Bean 需要依赖 A,Spring 会从三级缓存中获取 A 的工厂对象,并调用工厂方法生成 A 的早期引用(未完全初始化的实例)。
  • 生成的早期引用会被放入二级缓存(earlySingletonObjects),并从三级缓存中移除。
4. 注入 Bean A 到 Bean B
  • B 获取到 A 的早期引用,并将其注入到自己的属性中。
  • B 完成初始化后,被放入一级缓存(singletonObjects)中。
5. 完成 Bean A 的初始化
  • 回到 A 的初始化过程,此时 B 已经完全初始化。
  • A 获取到 B 的完全初始化实例,并完成自己的初始化。
  • 最终,A 被放入一级缓存中。

三级缓存的关键点

  1. 为什么需要三级缓存?

    • 如果只有二级缓存(直接存储早期引用),则无法支持某些复杂的场景,比如代理对象的创建。
    • 三级缓存允许 Spring 在需要时动态生成代理对象,而不是提前创建代理对象。
  2. 代理对象的处理

    • 如果 AB 是被代理的对象(如使用了 @Transactional 或 AOP),Spring 会在三级缓存中通过工厂对象生成代理对象,而不是直接暴露原始实例。
    • 这确保了即使存在循环依赖,最终注入的仍然是正确的代理对象。
  3. 只支持单例 Bean

    • Spring 的三级缓存机制仅适用于单例作用域的 Bean。对于原型(Prototype)作用域的 Bean,Spring 不会缓存其实例,因此无法解决循环依赖问题。

示例代码分析

以下是一个简单的循环依赖示例,展示了 Spring 如何通过三级缓存解决问题:

@Component
public class A {private final B b;@Autowiredpublic A(B b) {System.out.println("Initializing A");this.b = b;}
}@Component
public class B {private final A a;@Autowiredpublic B(A a) {System.out.println("Initializing B");this.a = a;}
}
执行流程
  1. Spring 开始创建 A
  2. 发现 A 依赖 B,暂停 A 的初始化,开始创建 B
  3. 发现 B 依赖 A,将 A 的早期引用放入三级缓存。
  4. B 获取到 A 的早期引用,完成初始化。
  5. 回到 A 的初始化过程,A 获取到完全初始化的 B,完成初始化。
输出结果
Initializing A
Initializing B

总结

Spring 的三级缓存机制通过以下步骤解决了循环依赖问题:

  1. 三级缓存(singletonFactories):存储工厂对象,用于动态生成早期引用。
  2. 二级缓存(earlySingletonObjects):存储提前暴露的早期引用。
  3. 一级缓存(singletonObjects):存储完全初始化的 Bean 实例。

这种机制确保了即使在存在循环依赖的情况下,Spring 仍然能够正确地完成 Bean 的初始化和依赖注入。然而需要注意的是,这种机制仅适用于单例 Bean,且不支持复杂的代理场景(如多层代理)。


文章转载自:

http://Vt8IhGOn.rjnky.cn
http://GHttN7sL.rjnky.cn
http://8b3tmypY.rjnky.cn
http://xe4ivTnY.rjnky.cn
http://3AAbsyJS.rjnky.cn
http://PfYY0aYp.rjnky.cn
http://J9uFPDH9.rjnky.cn
http://ssjPnVSd.rjnky.cn
http://rWJzT9zL.rjnky.cn
http://4wGSRXgy.rjnky.cn
http://UgsaLums.rjnky.cn
http://cJUTO9ST.rjnky.cn
http://fD3wPcSJ.rjnky.cn
http://HxbRijwV.rjnky.cn
http://lUsOKWaA.rjnky.cn
http://yf4tee76.rjnky.cn
http://NaSMkScv.rjnky.cn
http://mCCGpbdH.rjnky.cn
http://nlmJFj7f.rjnky.cn
http://wtNyYa3v.rjnky.cn
http://SBuyTluC.rjnky.cn
http://Pl1EWTAN.rjnky.cn
http://MivDysBK.rjnky.cn
http://HBit72b8.rjnky.cn
http://VyUgoA9h.rjnky.cn
http://LoxtkbRT.rjnky.cn
http://3wgjDI3H.rjnky.cn
http://swQuCiW3.rjnky.cn
http://56RxlQQC.rjnky.cn
http://YJiyT9HV.rjnky.cn
http://www.dtcms.com/wzjs/632184.html

相关文章:

  • 镇江网站设计哪家好昆明网站推广咨询平台
  • 淮北网站开发公司网站管理助手建站教程
  • 网站开发合同范本下载找装修
  • 网站模板框架餐饮业网站建设招标书
  • 做移动端网站泉州专业建站
  • 做五金外贸哪个网站比较好小程序代理开发费用
  • 珠宝手机网站模板企业网站分析案例
  • 网站 ftp网站建设联系方式
  • 网站建设时间安排网站开发网页设计js
  • 做响应式网站代码用网站做简历模板
  • 长沙市网站建设服务器搭建网站跑不满宽带
  • 东莞纸箱厂东莞网站建设关键词网站排名软件
  • 郑州市哪里有网站建设凡科互动公司
  • 网站设计 素材有了域名如何建立网站
  • 百度采购网官方网站江西省最新新闻
  • 网站建设与服务费是什么服务东莞阿里巴巴代运营公司
  • 网站开发课表查询如何做pc网站适配
  • 个人网站建设教程视频苍梧网站建设
  • 游戏网站创建wordpress绑定手机号
  • shopex官方网站论坛友链交易
  • 扬子科技网站建设网站设计项目计划书
  • 猴王水果竞猜网站建设wordpress同步到微信
  • 代做网站多少钱旅游网站建设标书
  • 总部基地网站建设公司衡水做wap网站的公司
  • 做旅游广告在哪个网站做效果好国内免费的ip地址
  • 景区建设网站的不足合肥网站建设培训中心
  • 个人公司网页如何设计长沙网站seo技术
  • 拉新充场app推广平台西安seo服务商
  • 网站开发的大致流程自已电脑做网站
  • 匿名网站建设成都广告公司排名