Spring如何解决循环依赖问题?

当然是用三级缓存来解决循环依赖问题。

那二级缓存能解决吗?

首先我们要知道Spring bean的生命周期

1.实例化(new)

2.属性赋值(populate)

3.初始化 一堆钩子函数(动态代理的生成也在这一步)

先来看二级缓存

在A实例化完成后,开始属性赋值的时候,去缓存中找B,发现B没有完成初始化,就开始B的实例化,之后发现A并没有初始化完成,所以B要去拿到提前暴露的A的对象,之后B就可以顺利进行初始化,初始化完成后将B放入一级缓存,之后A就可以去以及缓存中拿B,A就可以顺利执行完,执行完后,A也将放入一级缓存中。

那既然二级缓存能解决,为什么要用到三级缓存呢?

如果A不是简单的A,它如果要用到动态代理怎么办?

先搞清楚一个点,一级缓存中存的是A还是A的代理对象?

A引用B,B也引用A,如果A有代理对象的话,那A的代理对象也会引用A,那一级缓存放的是A还是A的代理对象呢?

当然是A的代理对象,如果放的是A,别人从容器里拿出A,调用它的方法,那注解就不生效了。(代理模式只做增强,不做修改 在执行A的前后增加某些操作)

那既然一级缓存存储的是A的代理对象,那B要是从二级缓存中拿到了A的暴露单例Bean(这个时候,这里面还是A的原始对象,非代理对象),但是咱们要的是A的代理对象。那不是GG了嘛

既然二级缓存不行,下面我们来介绍一下三级缓存如何解决循环依赖问题。

首先A实例化完后,放入第三级缓存中,然后去创建B,B去一级缓存中去拿 ,一级缓存没有,去二级缓存拿,也没有如果去三级缓存中拿,那肯定不行,B要的是代理对象,所以要有个地方去存A的代理对象,代理对象放在第二级缓存中。

相关推荐

  1. Spring循环依赖问题如何解决

    2024-05-11 19:08:04       16 阅读
  2. Spring如何解决循环依赖

    2024-05-11 19:08:04       23 阅读
  3. Spring如何解决循环依赖

    2024-05-11 19:08:04       19 阅读
  4. Spring如何解决循环依赖

    2024-05-11 19:08:04       11 阅读
  5. Spring 怎么解决循环依赖问题

    2024-05-11 19:08:04       7 阅读

最近更新

  1. 一个简单的spring+kafka生产者

    2024-05-11 19:08:04       1 阅读
  2. gradle安卓开发软件简介

    2024-05-11 19:08:04       1 阅读
  3. UE5.2 AI实时抠像(无需绿幕) + OBS推流直播 全流程

    2024-05-11 19:08:04       1 阅读
  4. 微软Edge浏览器全解析

    2024-05-11 19:08:04       1 阅读
  5. toString方法介绍

    2024-05-11 19:08:04       1 阅读
  6. LLM大语言模型知识点整理

    2024-05-11 19:08:04       1 阅读

热门阅读

  1. UnityDOTS备忘

    2024-05-11 19:08:04       12 阅读
  2. QT day2

    QT day2

    2024-05-11 19:08:04      8 阅读
  3. Qt宏和关键字

    2024-05-11 19:08:04       11 阅读
  4. SpringBoot 中检测文件编码格式

    2024-05-11 19:08:04       11 阅读
  5. SpringBoot 中 zip 文件解压工具类

    2024-05-11 19:08:04       9 阅读
  6. 【Python】如何训练模型并保存本地和加载模型

    2024-05-11 19:08:04       11 阅读
  7. 计算机答辩常见问题汇总(一)

    2024-05-11 19:08:04       11 阅读
  8. 蒙特卡洛求PI(抛点法)TypeScript实现

    2024-05-11 19:08:04       12 阅读
  9. 第十周笔记

    2024-05-11 19:08:04       16 阅读
  10. WHAT - npm和npx

    2024-05-11 19:08:04       14 阅读