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

Spring 如何解决循环依赖?

高频面试:Spring 如何解决循环依赖?

https://zhuanlan.zhihu.com/p/375308988

上面两篇文章分别是楼仔和escn

首先,我需要一个Bean,怎么拿到这个bean,其实不是每次都创建,是有缓存的,先从缓存中获取,没有再创建,缓存即map<k,v>,key是beaName,value是bean。

具体如何从缓存中获取,是先从一级缓存中获取完整bean,没有再从二级缓存中获取半成品bean。

bean生命周期:实例化,属性赋值,初始化(接口),ware,beforePostProcess,afterPostProcess,使用,销毁

三级缓存

SingleObject

earlySingleObject

BeanFactory

Bean 生命周期:实例化,属性赋值,初始化

AOP

举例 A依赖B B依赖A

实例化A,属性赋值,初始化时,需要B

B也是上面流程,实例化B,属性赋值,初始化时,需要A

卡在初始化上了,那边能不能先不初始化,完成实例化+属性赋值,就可以直接先用,最后再执行bean创建的后续流程。那边这个半成品(实例化+属性赋值),就是earlySingleObject,二级缓存。成品就是SingleObject,一级缓存。

如果只有一级缓存呢

同时存earlySingleObject和SingleObject,这时候会出现一个问题,其他线程获取bean,可能错误的获取到半成品,解决方案是,对一级缓存加锁,又导致,性能问题。

为什么需要二级缓存

就是为了解决性能问题,获取bean先从一级缓存获取,没有再从二级缓存获取,一级缓存不加锁,加锁下沉到二级缓存。

为什么需要三级缓存呢,因为AOP

AOP需要创建代理对象,前提需要在完整的原对象中(代理对象的创建(通常)是在bean初始化完成之后进行(通过BeanPostProcessor后置处理器))


http://www.mrgr.cn/news/80126.html

相关文章:

  • 2024年河南省高等职业教育技能大赛 大数据分析与应用赛项竞赛方案
  • 【前端学习笔记】Vue2进阶-Vuex、VueRouter
  • 程序的调试
  • C++ ——— 类的 6 个默认成员函数之 赋值运算符重载函数
  • 大模型该做什么业务?
  • C05S06-Nginx的内置变量和代理
  • Linux下socket广播通讯的实现
  • 图像融合算法笔记2024 CDTNet
  • pytorch_fid 安装笔记
  • 【AIGC】ChatGPT保护指令:高效提升GPTs提示词与知识库文件的安全性
  • 【PyCharm调试】显示一个对象值时会调用的方法
  • 长短期记忆神经网络(LSTM)介绍
  • 【ADS射频电路学习笔记】1. ADS基本操作
  • PHP搭建环境
  • depth wisepoint wise
  • 【收藏】Cesium 限制相机倾斜角(pitch)滑动范围
  • faster-RCNN训练【环境配置→自建数据集→训练→改错】
  • C语言实现八大排序算法
  • 【C语言】库函数常见的陷阱与缺陷(六):输入输出函数
  • kubeadm安装K8s集群之高可用组件keepalived+nginx及kubeadm部署
  • OSPF协议
  • ubuntu20.04复现 Leg-KILO
  • centos7的yum镜像源设置
  • 暂停一下,给Next.js项目配置一下ESLint(Next+tailwind项目)
  • 程序的调试
  • 6.2 MapReduce工作原理