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

韶关企业网站建设好看的seo网站

韶关企业网站建设,好看的seo网站,湖南it网站建设mxtia,php蓝色大气科技企业网站文章目录 1. 什么是循环依赖?1.1 概念解析1.2 示例代码 2. 循环依赖的类型2.1 构造器循环依赖(不可解决 ❌)2.2 Setter 方式或 Autowired 方式的循环依赖(可解决 ✅) 3. 解决循环依赖的方式3.1 方式一:使用…

文章目录

    • 1. 什么是循环依赖?
      • 1.1 概念解析
      • 1.2 示例代码
    • 2. 循环依赖的类型
      • 2.1 构造器循环依赖(不可解决 ❌)
      • 2.2 Setter 方式或 `@Autowired` 方式的循环依赖(可解决 ✅)
    • 3. 解决循环依赖的方式
      • 3.1 方式一:使用 `@Lazy`(延迟加载) 🚀
      • 3.2 方式二:修改依赖关系 🛠️
      • 3.3 方式三:使用 `@PostConstruct` 进行初始化 🎯
      • 3.4 方式四:使用 `ApplicationContextAware` 直接获取 Bean ⚙️
    • 4. 结论与最佳实践 🏆

1. 什么是循环依赖?

1.1 概念解析

在 Spring 容器中,循环依赖(Circular Dependency) 是指:

  • Bean A 依赖 Bean B
  • Bean B 依赖 Bean A
  • 这种情况下,Spring 在创建 Bean 时会出现互相等待,可能导致异常。

1.2 示例代码

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

💥 错误信息:

Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationException:
Error creating bean with name 'A': Requested bean is currently in creation:
Is there an unresolvable circular reference?

2. 循环依赖的类型

2.1 构造器循环依赖(不可解决 ❌)

  • 通过构造方法互相依赖,Spring 无法提前暴露 Bean 实例,因此会直接报错。
  • 示例:(上面代码就属于此类)

2.2 Setter 方式或 @Autowired 方式的循环依赖(可解决 ✅)

  • Spring 默认支持这种循环依赖(单例模式下)。
  • 示例:
@Component
public class A {private B b;@Autowiredpublic void setB(B b) {this.b = b;}
}@Component
public class B {private A a;@Autowiredpublic void setA(A a) {this.a = a;}
}

📌 Spring 解决方式:

  • 一级缓存(singletonObjects): 存放完全实例化的 Bean。
  • 二级缓存(earlySingletonObjects): 存放提前暴露的半成品 Bean。
  • 三级缓存(singletonFactories): 存放创建 Bean 的工厂,以支持代理(如 AOP 代理)。

3. 解决循环依赖的方式

3.1 方式一:使用 @Lazy(延迟加载) 🚀

  • 只在需要时才创建 Bean,避免初始化时发生循环依赖。
@Component
public class A {private final B b;@Autowiredpublic A(@Lazy B b) {this.b = b;}
}

适用于构造器注入,但不能解决所有情况。

3.2 方式二:修改依赖关系 🛠️

  • 重新设计 Bean 关系,避免直接互相依赖。
  • 可以通过 引入中间层(如事件监听模式、消息队列等) 解决。

3.3 方式三:使用 @PostConstruct 进行初始化 🎯

  • 让 Spring 先创建 Bean,然后在初始化时再注入依赖。
@Component
public class A {private B b;@Autowiredpublic A() {}@PostConstructpublic void init() {this.b = SpringContextUtil.getBean(B.class);}
}

避免构造方法循环依赖,适用于某些场景。

3.4 方式四:使用 ApplicationContextAware 直接获取 Bean ⚙️

@Component
public class A implements ApplicationContextAware {private B b;private ApplicationContext applicationContext;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext = applicationContext;}@PostConstructpublic void init() {this.b = applicationContext.getBean(B.class);}
}

适用于特定场景,但不推荐滥用 ApplicationContext,影响 Spring 设计模式。

4. 结论与最佳实践 🏆

方案适用情况备注
@Lazy适用于构造器循环依赖延迟加载可能会影响性能
修改依赖结构推荐最优方案,从根本上解决问题
@PostConstruct适用于部分场景但可能导致依赖获取不直观
ApplicationContext 获取 Bean可行但不推荐破坏 Spring 设计模式

🎯 最佳实践:

  1. 避免构造器循环依赖,优先使用 @Autowired 方式。
  2. 重构业务逻辑,减少不必要的循环依赖。
  3. 若无法避免,尝试 @Lazy@PostConstruct 方案。
  4. **尽量不使用 ApplicationContextAware,防止耦合过高。 **
http://www.dtcms.com/a/590390.html

相关文章:

  • 网站网页区别是什么产品展示类网站源码
  • 网站规划的步骤微信开发公众平台
  • 怎么自己做直播网站吗制作公司网站一般多久能好
  • 公司合法网站域名怎么注册水冷眸WordPress
  • 网站开发应财务如何记账wordpress 字符替换插件
  • 网站建设运营成本什么是网络营销评估主要评估哪些方面
  • 升级 macOS 26.1 之后 MagicMouse2 疯狂卡顿飘移,已解决
  • 无锡高端网站建设舆情信息网站
  • 网站建设的成功之处有哪些怎么做一个自己公司的网页
  • 怎么建设自己产品网站加强红色网站建设
  • 【QT开发】天气预报项目(详细注释版)
  • Vue嵌套(多级)路由
  • 精品网站建设公司互联网产品推广是做什么的
  • 东莞360推广的网站是谁做的云南楚雄医药高等专科学校
  • 学做网站的视频建设银行电商网站
  • 目前网站类型主要包括哪几种江苏营销型网站建设公司
  • 临沂网站开发多少钱wordpress无法发送
  • 信用网站标准化建设模块都有哪些东道设计招聘要求
  • YOLO项目笔记
  • 网站制作合同模板汽车网站flash模板
  • 凡科网做网站能达到什么效果济南网站建设(力推聚搜网络)
  • 网站备案表格样本一个人做的网站做什么好
  • 做个网站好还是做淘宝好品牌推广网站策划设计
  • 启迪网站建设招聘成都景观设计公司有哪些
  • 12306网站建设费用怎么做app下载网站
  • 外设模块学习(18)——5针双轴按键摇杆模块(STM32)
  • 怎么做网站充值网站注册公司需要几个人员
  • 网站掉权重是怎么回事软件开发者模式怎么打开
  • ArrayList底层实现及源码分析
  • 河北建设集团有限公司网站企业公司有哪些