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

宁波手机建站模板网页设计网站开发需要哪些知识

宁波手机建站模板,网页设计网站开发需要哪些知识,wordpress添加前台,做网站的app有什么作用Spring 循环依赖(circular dependency) 指的是多个 Bean 之间的相互依赖,比如: A 依赖 B,B 又依赖 A;或者 A → B → C → A 这种嵌套循环依赖。 这是一个常见又棘手的问题,但 Spring 是可以解…

Spring 循环依赖(circular dependency) 指的是多个 Bean 之间的相互依赖,比如:

  • A 依赖 B,B 又依赖 A;
  • 或者 A → B → C → A 这种嵌套循环依赖。

这是一个常见又棘手的问题,但 Spring 是可以解决部分类型的循环依赖的! 🌱
下面我们来详细说说 Spring 是 怎么解决循环依赖的,以及在哪些情况下解决不了

🔁 一、Spring 解决循环依赖的核心机制:三级缓存

Spring 的 Bean 生命周期中,在创建单例 Bean 时,使用了三级缓存机制来应对循环依赖问题。

✅ Spring 可解决的循环依赖:

构造方法之外的依赖注入(也称为Setter 注入 / 字段注入

📦 三级缓存的具体解释

Spring 为了避免无限递归创建 Bean,使用了 3 个缓存(都在 DefaultSingletonBeanRegistry 中):

缓存名类型作用
singletonObjects一级缓存存放完全初始化好的单例 Bean(可直接使用)
earlySingletonObjects二级缓存存放还未初始化完成的早期 Bean(已实例化但还没注入依赖)
singletonFactories三级缓存存放 ObjectFactory(可生成早期 Bean 的代理对象)

🧩 举个简单例子:A → B → A

@Component
public class A {@Autowiredprivate B b;
}@Component
public class B {@Autowiredprivate A a;
}

Spring 的处理过程如下:

  1. 创建 A(A 被标记为 “正在创建”)
  2. A 依赖 B,开始创建 B
  3. B 又依赖 A,发现 A 正在创建 → 从三级缓存中拿 A 的早期引用(代理或实例)
  4. B 注入了 A 的早期引用,B 创建完成
  5. 回到 A,注入 B,A 创建完成
  6. 把 A 的完整对象放入一级缓存

✅ 最终,A 和 B 都创建成功,并互相注入。

🚫 二、Spring 无法解决的循环依赖

1. 构造器注入导致的循环依赖(Constructor Injection)

@Component
public class A {public A(B b) {}
}@Component
public class B {public B(A a) {}
}
  • 构造函数中就需要对方的完整对象
  • 此时 Spring 无法提前暴露早期对象
  • 所以抛出:BeanCurrentlyInCreationException

解决方法:

  • 将构造器注入改为字段或 setter 注入

2. 原型(@Scope("prototype"))Bean 的循环依赖

  • Spring 只对 单例 Bean 做了三级缓存处理
  • 原型 Bean 每次都新建,Spring 不会缓存它
  • 所以 原型作用域的循环依赖,Spring 无法解决

3. 通过 AOP 代理增强的 Bean,未提前暴露代理对象

有些 AOP 场景中,Spring 无法及时将代理对象放入三级缓存,也会导致依赖注入失败。

✅ 三、开发中如何避免/解决循环依赖

✅ 建议一:优先使用构造器注入 + 明确设计依赖关系

  • 构造器注入更安全、清晰,但要避免循环
  • 如果存在循环依赖,说明你的设计可能需要重构

✅ 建议二:使用 @Lazy 延迟注入

  • Spring 会在需要时再去注入依赖,打破初始化顺序
@Autowired
@Lazy
private A a;

✅ 建议三:提取公共依赖,重构服务划分

  • 将 A 和 B 共同依赖的部分抽成一个新的类 C

🧠 总结:Spring 怎么解决循环依赖?

类型是否能解决原因
Setter/字段注入 + 单例 Bean✅ 可以通过三级缓存(提前暴露早期 Bean 引用)
构造器注入❌ 不行无法在构造阶段暴露代理对象
原型 Bean❌ 不行Spring 不缓存原型 Bean
AOP复杂代理⚠️ 有条件支持看 Spring 是否能生成早期代理对象
http://www.dtcms.com/wzjs/573773.html

相关文章:

  • 百度网盘怎么做网站2023网页游戏大全
  • 网站开发网站制作海尔网站的建设目标
  • 庆阳网站设计 贝壳下拉新网站快速收录
  • 定制型网站制作价格旅游公司网站建设
  • 上海最专业的网站设计制wordpress的文件结构
  • 电商网站 手续如何进行网站网站调试
  • 如何做网站美工flask 电影网站开发
  • 做一款小程序需要多少钱宁波正规seo推广公司
  • 玉溪网站开发做怎么网站
  • 企业为什么做网站系统南沙定制型网站建设
  • 高端企业网站开发深圳的互联网企业
  • 制作网站后台电子商务网络营销是什么
  • 网站广告布局无法进行网站备案
  • 湖南铁军工程建设有限公司官方网站yzipi主题wordpress
  • 长沙建网站联系电话宜城网站建设
  • 网站定制开发四大基本原则绵阳建设局网站皱劲松
  • 江西赣建建设监理网站哪个浏览器能打开那种网站
  • 安徽专业网站建设大全推荐暴雪游戏
  • 北京网站优化哪家好网站首页优化
  • 兰州建设一个网站多少钱泉州关键词自动排名
  • wordpress制作大型网站锦州网站优化
  • 龙岗网站建设哪家好为何建设银行的网站登不上去
  • 网站建设共享wordpress 会员聊天
  • 免费做国际网站申请个人网站有什么用
  • 虚拟空间网站ftp如何差异化同步如何搭建钓鱼网站
  • 郧阳网站建设如何网上注册公司流程
  • 南京做企业网站公司哪家好嘉兴模板建站平台
  • 可信网站认证费用建设网站定位分析
  • 做网站的数据从哪里来创建自己的个人网站
  • 昆明做网站建设硬件设备wordpress播放网盘视频