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

Spring源码-循环依赖

循环依赖问题

先分析下bean生命周期, 简化版:

1. 扫描, 获取所有的BeanDefinition,存入BeanDefinitionMap

2. 遍历BeanDefinition, 准备创建bean

3. 推断构造方法, 通过反射, 实例化bean对象(原始对象)

4. 属性赋值

5. 初始化前, 初始化

6. 初始化后, 可能AOP

7. 把经过完整生命周期对象放入单例池SingletonObjects

触发循环依赖-场景1:

ABean创建 > A依赖了B > 创建BBean > B依赖了A > 发现ABean正在创建

循环依赖解决思路

利用三级缓存

三级缓存

  1. singletonObjects:单例池, 缓存的是经过完整生命周期的bean
  2. earlySingletonObjects:缓存的是未经过完整生命周期的bean. 如果出现了循环依赖, 会提前把未经过完整生命周期的bean放入二级缓存, 如果这个bean有AOP, 放入的是代理对象, 否则放原始对象,都是未经过完整生命周期的bean
  3. singletonFactories:存的是一个ObjectFactory, 一个lambda表达式.当bean实例化后, 会生成一个lambda表达式,放入三级缓存. 这个lambda可能被执行, 也可能不被执行. 当执行时候, 可以获取原始对象或者代理对象.在bean属性赋值时, 如果发现循环依赖(当前正在创建的bean被属性bean依赖),才会执行lambda表达式拿到一个对象, 放入二级缓存.如果bean需要AOP, lambda表达式返回的是代理对象, 否则返回原始对象.
http://www.lryc.cn/news/226069.html

相关文章:

  • Excel下拉填充时,如何使得数字不递增?
  • ThreadLocal原理以及内存泄露问题
  • 值之字符串(string)
  • pytoch安装指定版本教程pytorch1.3安装笔记
  • k8s 裸金属集群部署metalLB软负载均衡 —— 筑梦之路
  • uni-app使用echarts数据不更新
  • 单挑特斯拉,华为智选车迈入第二阶段
  • acwing算法基础之搜索与图论--有向图的拓扑序列
  • Unity之NetCode多人网络游戏联机对战教程(7)--联机概念理解权威性Authority
  • Go并发编程(上)
  • MarkDown基础及表格、KaTeX公式、矩阵、流程图、UML图、甘特图语法
  • Citespace的使用
  • [模块]ES6与cjs的混合开发
  • git上传项目至github(Linux)
  • SSH 远程登录 WSL
  • 每天一道算法题:40. 组合总和 II
  • Centos7安装PostgreSQL 14
  • Shopee的折扣活动怎么分类?shopee设置折扣注意事项
  • 磁盘空间占用巨大的meta.db-wal文件缓存(tracker-miner-fs索引服务)彻底清除办法
  • 力扣:160. 相交链表(Python3)
  • 【华为OD机试AB高分必刷题目】无名的搜索题(Java-优先搜索(DFS)实现)
  • ant 任务(task)通过内嵌的arg元素传递命令行参数
  • STM32G0+EMW3080+阿里云飞燕平台实现单片机WiFi智能联网功能(三)STM32G0控制EMW3080实现IoT功能
  • IntelliJ IDEA - Git Commit 后 Commit 窗口不消失解决方案
  • Vue 组件化编程 和 生命周期
  • 《数字图像处理-OpenCV/Python》连载(41)图像的旋转
  • 案例 - 拖拽上传文件,生成缩略图
  • PHP 使用递归方式 将其二维数组整合为层级树 其中层级id 为一个uuid的格式 造成的诡异问题 已解决
  • rv1126-rv1109-添加分区,定制固件,开机挂载功能
  • 一台电脑使用多个gitee账号,以及提交忽略部分文件