Spring是如何解决循环依赖问题的及三级缓存的作用

Spring是如何解决循环依赖问题的及三级缓存的作用前置知识 所谓的三级缓存只是三个可以当作是全局变量的 Map Spring 的源码中大量使用了这种先将数据放入容器中等使用结束再销毁的代码风格 Spring 的初始化过程大致有四步我们说的循环依赖就是第四步在给 Bean 属性注入的时候发生的一个问题循环依赖就是 假设有两个类 A 和 B A 中需要注入 B B 中需要注入 A 由于 A 注入 B 时 B 没有创建 B 创建时 A 也无法创建导致的死循环问题我们都知道 AOP 是 Spring 的一个重要核心思想 其实现就是根据动态代理来实现的 也就是说我们的 Bean 其实很大概率都是要生成代理类 让

前置知识:
所谓的 三级缓存只是三个可以当作是全局变量的Map,Spring的源码中大量使用了这种 先将数据放入容器中等使用结束再销毁的代码风格
在这里插入图片描述

Spring的初始化过程大致有四步

  1. 创建beanFactory,加载配置文件
  2. 解析配置文件转化beanDefination,获取到bean的所有属性、依赖及初始化用到的各类处理器等
  3. 刷新beanFactory容器,初始化所有单例bean
  4. 注册所有的单例bean并返回可用的容器

我们说的循环依赖就是第四步在给Bean属性注入的时候发生的一个问题

1什么是循环依赖

2 如何解决循环依赖

如果没有循环依赖,A 依赖B,就是创建B,B依赖C就去创建C,创建完了逐级返回就行,并不需要什么缓存,所以,一级缓存之后的其他缓存(二三级缓存)就是为了解决循环依赖而设立的
一级缓存其实就是我们的成熟的Bean了,可以直接被使用
我们去看一下源码:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
从源码中我们可以看到,三级缓存里放的并不是实例化的Bean,而是一个工厂,这是为什么呢?
循环依赖在实际应用可能会有,但很少,简单的应用场景是: controller注入service,service注入mapper,只有复杂的业务,可能service互相引用,有可能出现循环依赖,所以为了出现循环依赖才去解决,不出现就不解决,虽然支持循环依赖,但是只有在出现循环依赖时才真正暴露早期对象,否则只暴露个获取bean的方法,并没有真正暴露bean,因为这个方法不会被执行到,这块的实现就是三级缓存(singletonFactories),只缓存了一个单例bean工厂
为什么是一个工厂?或者说这个工厂的作用?
三级缓存bean工厂的getObject方式,实际执行的是getEarlyBeanReference,如果对象需要被代理(存在beanPostProcessors -> SmartInstantiationAwareBeanPostProcessor),则提前生成代理对象。
在这里插入图片描述
三级缓存已经解决所有问题了,二级缓存用来做什么呢?为什么三级缓存不直接叫做二级缓存?这个应该是在缓存使用时决定的:
在这里插入图片描述
此时这个方法中的判断逻辑是:












  1. 一级缓存中没有
  2. 对象A确实正在创建中
  3. 二级缓存中也没有
  4. 最终去三级缓存中获取对象,从三级缓存获取后把对象从三级缓存删除然后放入到二级缓存中,由于当初放入到三级缓存中的是一个工厂,所以从三级缓存中拿对象是调用getEarlyBeanReference这个方法获取,这个方法的作用是如果对象需要代理,那么就返回代理类,如果不需要代理就返回原生类,至此属性注入A完成

3无法解决的循环依赖

构造函数循环依赖

多例的循环依赖

如果是多例的,在容器初始化的时候,不会去创建,所以早期没有放入到三级缓存中暴露出来,所以无法解决循环依赖,会报错




版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233902.html原文链接:https://javaforall.net

(0)
上一篇 2025年6月12日 下午4:01
下一篇 2025年6月12日 下午4:22


相关推荐

  • GPT-4o语音模式怎么开 ChatGPT 4o实时语音对话功能开启方法【教程】

    GPT-4o语音模式怎么开 ChatGPT 4o实时语音对话功能开启方法【教程】

    2026年3月15日
    2
  • h5播放rtsp流_h5页面嵌入微信公众号

    h5播放rtsp流_h5页面嵌入微信公众号项目需求最近遇到一个新需求,将rtsp视频流接入h5页面中,rtsp是无法直接在h5页面上显示的,所以得通过一些手段将视频转成可以在h5上显示的格式;博主尝试过用nginx+ffmpeg转流,也尝试过用bilibili开源的flv.js转流;但最终效果都不太好,延迟高,卡顿时间长;后面发现一个神器VLC客户端,实时播放,完全不卡顿。前期准备VLC下载链接根据上方链接下载VLC客户端,根据自己的操作系统下载安装,博主使用的是windows10系统实际开发1.确保rtsp视频流可用,海康威视IP

    2022年8月31日
    4
  • MidJourney金融风控部署教程

    MidJourney金融风控部署教程

    2026年3月15日
    2
  • 2021ArchLinux安装图文教程「建议收藏」

    2021ArchLinux安装图文教程「建议收藏」主要为以下步骤:1.下载ArchLinux安装镜像并制作U盘启动工具2.开机从U盘启动3.进行联网4.编辑镜像站文件(选择一个比较快的中国镜像源)5.开始分区(UEFI+GPT)6.格式化分区,并挂载7.开始安装基本操作系统8.配置基础系统9.引导系统10.用户管理11.网络配置12.安装桌面环境13.安装完后的工作开始:1.下…

    2022年4月25日
    147
  • 开发linux学习板子_linux嵌入式开发板推荐,资深程序员教给你

    开发linux学习板子_linux嵌入式开发板推荐,资深程序员教给你嵌入式是现在发展最快的 IT 技术之一了 很多人都选择了嵌入式这一行业 对于嵌入式来说 他挣得多 前景也很不错 学习嵌入式 开发板是最离不开的了 很多出入嵌入式行业的人对于嵌入式开发板 不知道 应该怎么选 今天在这里听听资深程序员怎么说 嵌入式开发板的选择也不用过于纠结 对于开发板来说 你应该首先要了解嵌入式 linux 开发板 嵌入式开发板 Embeddeddeve 就是半导

    2026年3月17日
    2
  • MT4下载怎么下?「建议收藏」

    MT4下载怎么下?「建议收藏」在哪里可以下载到mt4了?个人装了一些像应用宝这类的搜索软件,里面找不到地方下载MT4这个应用软件,怎么样,实际上到百度一搜索就能找到。当输入MT4的时候,会看到下拉框有这么多选择,只需选MT4安卓手机版输入便可`mt4download.cn`搜索出来肯定有很多下载链接,怎样选,正常选第一个搜索主页,【正版】MT4软件【免费下载】来自官网或正规下载网站,切记不要到那类广告网站,会给你电脑安装很多垃圾软件,使系统变得非常慢。点进这个链接后,你就能看到MetaTrader4广受欢迎的软件,根据你手机的操作系

    2022年8月15日
    12

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号