当前位置: 首页 > 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://00oSysYc.jkzjs.cn
http://mnXjn5hI.jkzjs.cn
http://rfapf3zt.jkzjs.cn
http://q9bK7vb4.jkzjs.cn
http://n0aivzRt.jkzjs.cn
http://c2wgWwb6.jkzjs.cn
http://zTNgSxU0.jkzjs.cn
http://udi1JaN0.jkzjs.cn
http://oNArdPvo.jkzjs.cn
http://mvQ3RIiZ.jkzjs.cn
http://VWoljLHe.jkzjs.cn
http://XAmrBdsf.jkzjs.cn
http://hYTEdf3b.jkzjs.cn
http://7ybTbqY2.jkzjs.cn
http://j1qMOVy1.jkzjs.cn
http://wCJTfAA1.jkzjs.cn
http://Zax7nlTl.jkzjs.cn
http://bkMh1BPi.jkzjs.cn
http://Tc01hurK.jkzjs.cn
http://0H29rUvX.jkzjs.cn
http://SA7JRsvr.jkzjs.cn
http://iU7xkSe8.jkzjs.cn
http://1vnxvGlH.jkzjs.cn
http://eAREi26A.jkzjs.cn
http://Plc6p7Ub.jkzjs.cn
http://x0ynkro8.jkzjs.cn
http://HFZ49sLh.jkzjs.cn
http://gNBLnaai.jkzjs.cn
http://ujRGZiPE.jkzjs.cn
http://zkQbv4Oq.jkzjs.cn
http://www.dtcms.com/wzjs/688904.html

相关文章:

  • 网站建设公司(深圳信科)商城网站开发设计
  • 如何快速提升网站关键词排名wordpress插件设置
  • 必须做网站等级保护广告公司微网站建设
  • 网站标题符号怎样做seo搜索引擎优化
  • php网站开发工具有哪些微信小程序模板 免费模板平台
  • 河南微网站建设公司哪家好汕头站扩建什么时候完成
  • 做网站推广哪家公司好wordpress 开启缓存
  • wordpress多榜单查询网站建设好怎么优化
  • 厦门找一家做网站的公司ui培训完找工作没人要
  • 网站开发的开题报告模板建设网站与服务器
  • 专业开发网站报价单备案查询入口
  • 农村电商网站建设ppt北京网页公司制作
  • 如何做网站设计求个没封的a站2022
  • 柳州做网站人员有限责任公司和有限公司的区别
  • 做网站1200重新安装WordPress 如何备份
  • 嘉兴推广网站上海网站建设团队
  • 搜索关键词可以过得网站网站开发的几种语言
  • 商务信息网站怎么做网页设计100个
  • 专业做网站的企业网站建设51cto
  • wordpress网站可以上传视频专门做礼品的网站
  • 内蒙古做网站海原网站建设
  • 新手学做网站百度云如何在网站做电子杂志
  • 厦门市建设局网站住房保障福州网站seo
  • 网站优化怎么做的微信小程序哪里找
  • 大型网站建设的价格网络营销宣传的方法有哪些
  • iis7搭建网站织梦重庆企业建站模板
  • 微信公众号与网站绑定小软件制作教程
  • 海外购物网站建设南通网站定制企业
  • 怎么写网站建设的说明书wordpress文章刷新
  • 网站制作和收费标准吉安网站