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

北京网站制作的公司建筑企业查询系统官网

北京网站制作的公司,建筑企业查询系统官网,我的世界服务器如何做充钱网站,南宁的网站建设前记:千万不要在实际项目开发中这么玩。 在Spring中,如果A类和B类之间存在相互依赖(即A类有一个B类的属性,B类有一个A类的属性),这种情况称为循环依赖(Circular Dependency)。Spring…

 前记:千万不要在实际项目开发中这么玩。

        在Spring中,如果A类和B类之间存在相互依赖(即A类有一个B类的属性,B类有一个A类的属性),这种情况称为循环依赖(Circular Dependency)。Spring框架对循环依赖的处理机制较为复杂,但通过其内部的缓存机制可以解决部分循环依赖问题。以下是具体分析:


三级缓存机制

Spring如何处理循环依赖?

Spring通过三级缓存机制来处理单例Bean的循环依赖问题,具体分为以下步骤:

1. 实例化阶段(Instantiation)

  • 当Spring需要创建A类的Bean时,会先实例化A(通过反射调用无参构造函数),此时A的属性(包括B类的属性)尚未注入。
  • Spring会将未完全初始化的A的实例放入**一级缓存(singletonObjects)**中。

2. 依赖注入阶段(Dependency Injection)

  • 在为A注入B类属性时,Spring发现B还未创建,于是转而创建B的Bean。
  • 创建B时,Spring会先实例化B(调用无参构造函数),此时B的属性(包括A类的属性)尚未注入。
  • Spring将未完全初始化的B的实例放入一级缓存中。
  • 接着,Spring尝试为B注入A类的属性,此时发现A已经在一级缓存中(虽然A的B属性还未注入完毕)。
  • 此时,Spring会从一级缓存中取出A的半成品实例(此时A的B属性尚未完成注入),并将其注入到B的A属性中。

3. 继续注入A的B属性

  • 回到A的依赖注入阶段,Spring现在可以为A注入B的实例(因为B已经实例化完成)。
  • 此时A的B属性被成功注入,但B的A属性已经提前注入了A的半成品实例。

4. 初始化阶段(Initialization)

  • 当所有依赖注入完成后,Spring会依次调用A和B的初始化方法(如@PostConstructinit-methodInitializingBean.afterPropertiesSet())。
  • 这里需要注意:A和B的初始化方法可能会在对方的属性尚未完全初始化时被调用,因此需要确保代码逻辑能够处理这种情况。

关键点总结

  1. 支持的循环依赖类型

    • Setter注入或字段注入:Spring可以通过三级缓存机制处理这种循环依赖。
    • 构造器注入:Spring无法处理构造器注入的循环依赖,会直接抛出BeanCurrentlyInCreationException异常。
  2. 处理流程

    • 一级缓存(singletonObjects):存储完全初始化的Bean。
    • 二级缓存(earlySingletonObjects):存储早期暴露的Bean实例(用于处理循环依赖)。
    • 三级缓存(singletonFactories):存储ObjectFactory对象,用于延迟获取Bean。
  3. 潜在风险

    • 如果在Bean的初始化方法(如@PostConstruct)或业务方法中,访问对方Bean的属性,可能会得到未完全初始化的值,导致逻辑错误。
    • 循环依赖会增加代码的复杂性,降低可维护性,应尽量避免。

如何避免循环依赖?

  1. 重构代码

    • 将共同依赖提取到第三个类中,打破循环。
    • 通过接口解耦,减少直接依赖。
  2. 使用Setter注入而非构造器注入

    • Spring仅支持Setter或字段注入的循环依赖,构造器注入会导致失败。
  3. 引入中间Bean

    • 通过引入中间类作为中介,分离A和B的直接依赖。

示例代码

假设A和B的依赖关系如下:

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

Spring的处理流程

  1. 创建A的实例(未注入B)。
  2. 将A放入一级缓存。
  3. 创建B的实例(未注入A)。
  4. 将B放入一级缓存。
  5. 为B注入A时,从一级缓存获取A的半成品实例。
  6. 为A注入B的完整实例。
  7. 依次调用A和B的初始化方法。

总结

        Spring通过缓存机制可以处理Setter或字段注入的循环依赖,但存在潜在风险。建议在设计时尽量避免循环依赖,通过合理拆分代码或引入中间层来消除依赖循环,从而提升代码的可维护性和稳定性。

后记:绝对不能在实际开发项目中这么玩啊,否则被你老大发现就得挨削了。

(望各位潘安、各位子健/各位彦祖、于晏不吝赐教!多多指正!🙏)


文章转载自:

http://bDBMv9bb.zcncb.cn
http://t77FVlz5.zcncb.cn
http://6qyhMwG3.zcncb.cn
http://Jo4KWRL0.zcncb.cn
http://RUQumr06.zcncb.cn
http://YBeCyLFp.zcncb.cn
http://VhUfaYjb.zcncb.cn
http://9c0uTrVF.zcncb.cn
http://6Q3W2jl9.zcncb.cn
http://ASG0BWLn.zcncb.cn
http://VUVOClIa.zcncb.cn
http://broFmw8j.zcncb.cn
http://9Jdib5fZ.zcncb.cn
http://BxXcQ7cj.zcncb.cn
http://AvRTDpAf.zcncb.cn
http://EfmgZYQB.zcncb.cn
http://k5JSn0lV.zcncb.cn
http://Q9s52jom.zcncb.cn
http://QQUzoNgN.zcncb.cn
http://FoZx9CxA.zcncb.cn
http://JwvvN73D.zcncb.cn
http://PeEy55dO.zcncb.cn
http://YSXVdP5H.zcncb.cn
http://BhIsWDgN.zcncb.cn
http://djMiuJwA.zcncb.cn
http://IZG1ARGV.zcncb.cn
http://tCBaAmZ1.zcncb.cn
http://TBu9owSM.zcncb.cn
http://PEzi6wQg.zcncb.cn
http://isn5QtV7.zcncb.cn
http://www.dtcms.com/wzjs/753796.html

相关文章:

  • 天津学网站建设编辑网站绑定
  • 网站建设中常用的技术有哪些泉州英文网站建设
  • 用wordpress做的网站佛山网站制作哪家便宜
  • 章丘做网站优化做百度快照要先有网站吗
  • 做网站复杂吗wordpress个人博客模版
  • 官网天下迈步者seo
  • 自己做网站需要固定ip吗免费注册qq邮箱
  • 建设网站公司哪个好自己做网站需要买哪些
  • 做电影网站会不会涉及版权问题wordpress怎么更改域名
  • 网站建设与管理 期末wordpress二级目录安装
  • 商城网站的模块设计桂林网络设计
  • 合肥肥东网站建设网络优化2年工资有多少
  • 做网站安全联盟解松江车墩网站建设
  • 网站建设费用还是网络专业百度关键词优化的意思
  • 台州网站推广优化网上申请营业执照
  • 青州营销型网站建设合肥工程建设信息平台
  • 做网站内容字体多少ptctf wordpress
  • 辽宁省和城乡建设厅网站住房和城乡建设部政务服务门户官网
  • 免费建站哪个好带后台的网站模板
  • 建立一个网站 优帮云百度智能建站平台
  • 技术共享平台南通网站优化公司
  • 微信后台网站开发知识体系电子商务网站建设的开发方案
  • 网站编程入门教程实时军事热点
  • 海口制作网站企业wordpress前台修改用户头像
  • 网站建设利弊三星网上商城优惠券
  • 网站建设培训会讲话视频拍摄公司
  • 试述网站建设的步骤截屏的图片wordpress不能显示
  • 帮助网站源码徐州自助建站模板
  • 做网站需要什么专业方向的员工下载宝硬盘做网站
  • 网站页面静态化方案ftp给网站做备份