阿里面试官居然不懂Spring是如何处理循环依赖的?

  • 时间:2022-03-15 14:08 作者:JavaEdge 来源: 阅读:438
  • 扫一扫,手机访问
摘要:BeanPostProcessor的after方法中会完成动态代理商对象的创立。在创立代理商对象之前,能否需要原始对象?需要原始对象!若刚开始先创立了原始对象,而后又创立了代理商对象,则对外暴露引用时,应该用原始对象还是用代理商对象呢?程序是写死的,没那么智能,说要判断用什么对象,所以我们需要保证,当bea

BeanPostProcessor的after方法中会完成动态代理商对象的创立。

  • 在创立代理商对象之前,能否需要原始对象?
    需要原始对象!

  • 若刚开始先创立了原始对象,而后又创立了代理商对象,则对外暴露引用时,应该用原始对象还是用代理商对象呢?
    程序是写死的,没那么智能,说要判断用什么对象,所以我们需要保证,当bean需要被引用时,必需给出一个最终的结果:要么是原始对象,要么是代理商对象,当生成代理商对象时,原始对象会被覆盖掉。

  • 怎样确定对象什么时候对外暴露或者者说对外引用呢?
    无法确定!所以有了三级缓存这个骚操作!有了三级缓存,每次在创立完对象后,不是直接把对象放到一级或者二级缓存,而是先将一个lambda表达式放到三级缓存中,当需要被引用时,会优先从三级缓存中获取到lambda,而后根据lambda表达式解决结果判断究竟是原始对象还是代理商对象。
    getEarlyBeanReference在此方法中已唯一确定了对外暴露的对象究竟是原始对象还是代理商对象。

当Bean产生循环依赖时,比方BeanA的构造方法依赖BeanB作为成员需要注入,BeanB也依赖BeanA,你觉得会出现什么问题呢?又有哪些处理方式呢?

通过set方法去解决,背后的原理其实是缓存。
主要处理方式:

三级缓存

singletonObjects

一级缓存, Cache of singleton objects
bean name --> bean instance。
存放完整对象。

earlySingletonObjects

二级缓存, Cache of early singleton objects
bean name --> bean instance 提前曝光的BEAN缓存。
存放半成品对象。

singletonFactories

三级缓存, Cache of singleton factories
bean name --> ObjectFactory。需要的对象被代理商时,就必需使用三级缓存(否则二级就够了)。处理循环依赖中存在aop的问题
存放 lambda 表达式和对象名称的映射。

  • spring中已经有了循环依赖的处理方案,为什么项目中还会出现循环依赖的问题?
    spring中现有的处理循环依赖问题的方案只是一种预防机制, 当符合此情况的时候可以处理,但是在实际的场景中会存在很多不匹配的情况,构造器的循环依赖是无法处理的!

带着aop的实现来重新走一下刚刚执行的逻辑, 体会各个对象在程序运行过程中的流转过程,对象的三个缓存中的迁移过程,画个图,总结下,debug下,
起始断点的入口在:finishBeanFactorylnitialization方法。


image
  • 全部评论(0)
上一篇:2019-10-20
下一篇:Docker 编译安装php8
最新发布的资讯信息
【系统环境|】2FA验证器 验证码如何登录(2024-04-01 20:18)
【系统环境|】怎么做才能建设好外贸网站?(2023-12-20 10:05)
【系统环境|数据库】 潮玩宇宙游戏道具收集方法(2023-12-12 16:13)
【系统环境|】遥遥领先!青否数字人直播系统5.0发布,支持真人接管实时驱动!(2023-10-12 17:31)
【系统环境|服务器应用】克隆自己的数字人形象需要几步?(2023-09-20 17:13)
【系统环境|】Tiktok登录教程(2023-02-13 14:17)
【系统环境|】ZORRO佐罗软件安装教程及一键新机使用方法详细简介(2023-02-10 21:56)
【系统环境|】阿里云 centos 云盘扩容命令(2023-01-10 16:35)
【系统环境|】补单系统搭建补单源码搭建(2022-05-18 11:35)
【系统环境|服务器应用】高端显卡再度登上热搜,竟然是因为“断崖式”的降价(2022-04-12 19:47)
手机二维码手机访问领取大礼包
返回顶部