码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【Spring篇 | 补充】三级缓存解决循环依赖


    在这里插入图片描述

    文章目录

    • 7.三级缓存解决循环依赖
      • 7.1何为循环依赖?
      • 7.2三级缓存解析
      • 7.3三级缓存解决循环依赖
        • 7.3.1实例化A
        • 7.3.2创建B的需求
        • 7.3.3实例化B
        • 7.3.4注入A到B
        • 7.3.5B创建完成
        • 7.3.6回溯至A
        • 7.3.7清理二级缓存
      • 7.4为什么不能用二级缓存解决循环依赖?

    7.三级缓存解决循环依赖

    7.1何为循环依赖?

    • 循环依赖其实就是循环引用,也就是两个或两个以上的bean互相持有对方,最终形成闭环。比如,A依赖于B,而B又依赖于A。
    • Spring处理:循环依赖在Spring中是允许存在的,因为Spring框架依据三级缓存机制已经解决了大部分的循环依赖问题。

    7.2三级缓存解析

    • 一级缓存(singletonObjects):单例池,存放已历经完整生命周期(实例化、注入、初始化)的bean对象。
    • 二级缓存(earlySingletonObjects):缓存实例化完成的bean对象。
    • 三级缓存(singletonFactories):存放ObiectFactory对象,它们能用来创建对应bean的实例。

    7.3三级缓存解决循环依赖

    Spring 循环依赖流程图

    7.3.1实例化A

    首先开始实例化beanA,同时在三级缓存中创建一个与A关联的ObiectFactory对象并存入
    singletonFactories

    7.3.2创建B的需求

    A在初始化过程中需要B对象,于是触发B的创建逻辑

    7.3.3实例化B

    B被实例化完成后,同样会在三级缓存singletonFactories中为其创建一个ObjectFactory。

    7.3.4注入A到B

    • 当B需要注入A时,会通过三级缓存中对应的ObiectFactory生成A的对象,并将其存入二级缓存earlySingletonObjects。
    • 这里生成的A对象可能是原始对象,也可能是代理对象,关键在于ObjectFactory都能胜任生产任务。

    7.3.5B创建完成

    • B成功从二级缓存
      earlySingletonObiects获取到A对象并完成注入,此时B创建完毕,被放入一级缓存singletonObiects。

    7.3.6回溯至A

    • 回到A的初始化过程,由于B现在已存在于一级缓存中,A可以直接注入B,完成自身的初始化,

    7.3.7清理二级缓存

    • 最后,二级缓存中用于临时存储的A对象会被清除,确保缓存状态的整洁。

    7.4为什么不能用二级缓存解决循环依赖?

    1. 其实二级缓存同样也能很好解决循环引用问题。

    2. 使用三级而非二级缓存并非出于IOC的考虑,而是出于AOP的考虑,即若使用二级缓存,在AOP情形下 , 注入到其他bean的,不是最终的代理对象,而是原始对象。

    3. 循环依赖下,有没有代理情况下的区别就在:

      singletonObject = singletonFactory.getObject();
      
      • 1

      在循环依赖发生的情况下 B 中的 A 赋值时:

      1. 无代理:getObject 直接返回原来的 Bean
      2. 有代理:getObject 返回的是代理对象

      然后都放到二级缓存。

      image-20240425084406602

  • 相关阅读:
    从零开始C语言精讲篇1:初识C语言
    2019-10《信息资源管理 02378》真卷(独家文字版),圈定章节考点+统计真题分布
    达美乐中国再闯港交所,能否IPO必达?
    node版本与node-sass版本不兼容时问题解决
    数据可视化-直方图
    vue项目中使用antvX6新手教程,附demo案例讲解(可拖拽流程图、网络拓扑图)
    开源WordPress博客主题二次元风-LoliMeow主题
    数据通信——传输层TCP(超时时间选择)
    Kibana安装、配置
    【王道】计算机组成原理第五章中央处理器(五)
  • 原文地址:https://blog.csdn.net/weixin_61440595/article/details/138174873
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号