学习总结录 学习总结录
首页
归档
分类
标签
  • Java基础
  • Java集合
  • MySQL
  • Redis
  • JVM
  • 多线程
  • 计算机网络
  • 操作系统
  • Spring
  • Kafka
  • Elasticsearch
  • Python
  • 面试专题
  • 案例实践
  • 工具使用
  • 项目搭建
  • 服务治理
  • ORM框架
  • 分布式组件
  • MiniSpring
  • 设计模式
  • 算法思想
  • 编码规范
友链
关于
GitHub (opens new window)
首页
归档
分类
标签
  • Java基础
  • Java集合
  • MySQL
  • Redis
  • JVM
  • 多线程
  • 计算机网络
  • 操作系统
  • Spring
  • Kafka
  • Elasticsearch
  • Python
  • 面试专题
  • 案例实践
  • 工具使用
  • 项目搭建
  • 服务治理
  • ORM框架
  • 分布式组件
  • MiniSpring
  • 设计模式
  • 算法思想
  • 编码规范
友链
关于
GitHub (opens new window)
  • Java基础

  • Java集合

  • MySQL

  • Redis

  • JVM

  • 多线程

  • 计算机网络

  • Spring

    • Spring循环依赖问题
      • 循环依赖三种场景
      • SpringBean的生命周期
      • Spring执行逻辑
      • 循环依赖的问题
      • 三级缓存如何解决循环依赖问题
        • 各级缓存的作用
        • A和B相互依赖再分析
      • 参考
  • Kafka

  • Elasticsearch

  • Python

  • 面试专题

  • 知识库
  • Spring
旭日
2023-04-04
目录

Spring循环依赖问题

# 循环依赖三种场景

image-20230404154538537

  • 情况一:自己依赖自己
  • 情况二:A依赖B,B依赖C
  • 情况三:A依赖B,B依赖C,C依赖A,形成一个环

# SpringBean的生命周期

image-20230404155234895

  • Spring初始化
  • getBean()方法:反射的方式去加载配置文件
  • 实例化
  • 属性注入
  • 初始化
  • 销毁

# Spring执行逻辑

  • 先从“第一级缓存”找对象,有就返回,没有就找“二级缓存”;
  • 找“二级缓存”,有就返回,没有就找“三级缓存”;
  • 找“三级缓存”,找到了,就获取对象,放到“二级缓存”,从“三级缓存”移除。

# 循环依赖的问题

现在假设没有三级缓存下,针对A和B相互依赖进行分析,流程图如下:

image-20230404160434848

  • 当A进行属性注入的时候,由于需要依赖B,因此B需要进行实例化
  • B进行属性注入的时候,由于又需要依赖A,因此A又需要进行实例化,最终形成环,造成循环依赖问题。

# 三级缓存如何解决循环依赖问题

# 各级缓存的作用

  • 一级缓存:为Spring 的单例属性而生,就是个单例池,用来存放已经初始化完成的单例 Bean;
  • 二级缓存:为解决 AOP而生,存放的是半成品的 AOP 的单例 Bean;
  • 三级缓存:为打破循环而生,存放的是生成半成品单例 Bean 的工厂方法。

# A和B相互依赖再分析

image-20230404162305683

  • A实例化的时候,会把A工厂对象放入三级缓存
  • 当B属性注入的时候,需要去获取B,这个时候就直接从三级缓存中拿对象即可,避免了环的形成。

# 参考

源码深度解析,Spring 如何解决循环依赖 (opens new window)

#Spring
上次更新: 2024/06/29, 15:13:44
应用层概述
生产者客户端开发

← 应用层概述 生产者客户端开发→

最近更新
01
基础概念
10-31
02
Pytorch
10-30
03
Numpy
10-30
更多文章>
Theme by Vdoing | Copyright © 2021-2024 旭日 | 蜀ICP备2021000788号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式