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

中建招聘官网入口邯郸网站优化公司

中建招聘官网入口,邯郸网站优化公司,阆中市网站建设,百度收录网址官网1、简介循环依赖 在 Spring 框架中,循环依赖是指两个或多个 Bean 互相依赖,形成了一个闭环。例如,Bean A 依赖于 Bean B,而 Bean B 又依赖于 Bean A。这种依赖关系可能会导致初始化失败。Spring 提供了一种机制来解决这种循环依赖…

1、简介循环依赖

在 Spring 框架中,循环依赖是指两个或多个 Bean 互相依赖,形成了一个闭环。例如,Bean A 依赖于 Bean B,而 Bean B 又依赖于 Bean A。这种依赖关系可能会导致初始化失败。Spring 提供了一种机制来解决这种循环依赖问题。

2、Spring 解决循环依赖的核心机制

Spring 使用三级缓存和提前暴露未完全初始化的 Bean 来解决循环依赖问题。具体来说,Spring 在创建 Bean 的过程中会将 Bean 的不同状态存储在三个缓存中:

  1. 一级缓存(singletonObjects)

    • 存储已经完全初始化完成的单例 Bean。
    • 这些 Bean 已经完成了所有依赖注入,并且可以安全地使用。
  2. 二级缓存(earlySingletonObjects)

    • 存储提前暴露的、尚未完全初始化的 Bean。
    • 当一个 Bean 正在创建过程中,但已经被其他 Bean 需要时,Spring 会将该 Bean 提前暴露到这个缓存中。
  3. 三级缓存(singletonFactories)

    • 存储用于创建提前暴露 Bean 的工厂对象(ObjectFactory)。
    • 当一个 Bean 正在创建过程中,Spring 会将该 Bean 的工厂对象放入三级缓存,以便后续需要时可以通过工厂创建出提前暴露的 Bean。

3、循环依赖的解决过程

假设场景

  • Bean A 依赖于 Bean B。
  • Bean B 依赖于 Bean A。

具体步骤

  1. 创建 Bean A

    • Spring 开始创建 Bean A。
    • 在实例化 Bean A 后,Spring 将其工厂对象(ObjectFactory)放入三级缓存(singletonFactories)中。
    • 接着,Spring 开始为 Bean A 注入依赖(即需要获取 Bean B)。
  2. 创建 Bean B

    • Spring 发现 Bean A 需要 Bean B,于是开始创建 Bean B。
    • 在实例化 Bean B 后,Spring 将其工厂对象(ObjectFactory)放入三级缓存(singletonFactories)中。
    • 接着,Spring 开始为 Bean B 注入依赖(即需要获取 Bean A)。
  3. 从缓存中获取 Bean A

    • Spring 发现 Bean B 需要 Bean A,而 Bean A 此时正在创建过程中。
    • Spring 从三级缓存(singletonFactories)中找到 Bean A 的工厂对象,并通过工厂对象创建出 Bean A 的早期引用(未完全初始化的 Bean A)。
    • Spring 将 Bean A 的早期引用放入二级缓存(earlySingletonObjects),并将其注入到 Bean B 中。
  4. 完成 Bean B 的创建

    • Bean B 的依赖注入完成,Spring 将 Bean B 完全初始化后放入一级缓存(singletonObjects)。
  5. 完成 Bean A 的创建

    • 回到 Bean A 的创建过程,Spring 将 Bean B 注入到 Bean A 中。
    • Bean A 的依赖注入完成,Spring 将 Bean A 完全初始化后放入一级缓存(singletonObjects)。

注意:

  1. 仅支持单例 Bean 的循环依赖

    • Spring 的循环依赖解决方案仅适用于单例作用域(@Scope("singleton"))的 Bean。
    • 对于原型作用域(@Scope("prototype"))的 Bean,Spring 不会缓存它们,因此无法解决循环依赖。
  2. 构造器注入可能导致循环依赖无法解决

    • 如果循环依赖是通过构造器注入实现的,Spring 可能无法解决这种循环依赖。
    • 这是因为构造器注入要求在实例化时就完成依赖注入,而此时 Bean 尚未被放入缓存。
  3. 推荐避免循环依赖

    • 虽然 Spring 提供了循环依赖的解决方案,但循环依赖通常是设计上的问题。
    • 更好的做法是通过重构代码来避免循环依赖,例如引入中间层或使用接口解耦。

 

http://www.dtcms.com/wzjs/580885.html

相关文章:

  • 衡水外贸网站建设营销助手下载app下载
  • 站长之家的作用wordpress更换网址后台怎么进
  • 有没有做淘宝首页特效的网站健康网站模版
  • 做网站开始要注意什么靓号注册网站免费
  • 网站建设纳千网络win2012 iis 部署网站
  • 黔东南建设厅官方网站泰州网站优化公司
  • 网站正在建设中 模版广告公司名字简单大气三个字
  • 响应式企业网站建设网站建设方案
  • 大兴手机网站建设免费企业网站哪个好
  • 随州网站建设学校网站规划的解释
  • 做网站还有意义vi设计公司[本源百纳设计
  • 网站如何被谷歌收录南皮哪有做网站的
  • 乐辰网站建设商城站时刻表
  • jsp网站seo优化电子商务网站设计步骤
  • 广告制作公司网站建设模板网站模板 div
  • 做网站要素智慧团建管理系统
  • 网站开发推荐新手网页设计教程
  • 宁波网站搭建公司上海提供虚拟注册地址的园区
  • 网站建设中哪些最重要性简述建设一个网站的具体步骤6
  • 学院网站策划书微信开放平台管理员怎么解除
  • 网站国际联网备案中信建设有限责任公司投资部执行总监
  • asp 个人网站淄博网站建设hiddd
  • 仿站定制模板建站做五金找订单查什么网站
  • 网站开发需要多钱岳阳汨罗网站建设
  • 网站建设icp备案h5 php mysql网站开发
  • 北京市房山建设培训学校网站wordpress 菜单 移动端
  • 18岁以上站长统计seo赚钱方式
  • 哈尔滨网站设计哪家公司好做网站效果图总结
  • 东莞网站建设制作公司上海网站建设在哪里
  • 企业网站建立意义何在wordpress list