spring一二三级缓存和@Lazy解决循环依赖流程

 简单对象指的是 实例化后还没有属性注入的时候的早期bean

lambda表达式用于判断a是否存在aop代理

假如a和b循环依赖,a实例化时,

bean创建流程如下:


0,创建一个set记录当前正在实例化的bean,

1.实例化a的简单对象时,从一级缓存寻找,没找到则开始创建,首先把a的lambda表达式放入三级缓存,并在set中标识a正在创建

2.填充a中属性b的时候,去一级缓存寻找b的实例,如果没找到,则创建b的实例化简单对象,并把b的lambda表达式放入三级缓存,并在set中标识b正在创建,然后为b属性注入,发现存在为a的属性,先去一级缓存找a,没找到,又通过set发现a正在创建,则判断出a和b存在循环依赖,然后去二级缓存寻找a,也没找到,最后去三级缓存中取出a的lambda表达式,判断a是否存在aop代理,如果存在aop代理,则生成a的代理对象放入二级缓存,否则生成a的普通对象放入二级缓存,并删除三级缓存中的a。 b属性注入完毕后初始化完成,将b的实例存入一级缓存。删除其他缓存中的b。

3.经过b的创建后,创建c时,如果a和c也循环依赖,则填充c中的a属性时,可直接从二级缓存取出a。c属性注入完毕后初始化完成,将c的实例存入一级缓存。删除其他缓存中的c。

4.a得到b和c后,最后填充完其他属性后,把a的实例(普通或代理),通过二级缓存get(beanName)后存入一级缓存,并从二级缓存删除

@Lazy注解解决循环依赖:

由spring直接注入属性的代理对象,从而解决循环依赖

相关推荐

  1. Spring如何解决循环依赖

    2024-04-24 05:48:02       21 阅读
  2. Spring如何解决循环依赖

    2024-04-24 05:48:02       17 阅读
  3. spring循环依赖解决方案

    2024-04-24 05:48:02       13 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-24 05:48:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-24 05:48:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-24 05:48:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-24 05:48:02       18 阅读

热门阅读

  1. python排序方法的相关介绍

    2024-04-24 05:48:02       12 阅读
  2. 设计与运营电商系统:构建成功的电商平台

    2024-04-24 05:48:02       11 阅读
  3. C#中的delegate和event,及他们的区别

    2024-04-24 05:48:02       11 阅读
  4. docker swoole+php8.2

    2024-04-24 05:48:02       11 阅读
  5. linux复习提纲

    2024-04-24 05:48:02       12 阅读
  6. 如何在 Ubuntu 上启用 IPv6

    2024-04-24 05:48:02       12 阅读
  7. 十几个好用的学习以及AI网站

    2024-04-24 05:48:02       13 阅读
  8. python使用selenium如何获取一个div下所有的文本

    2024-04-24 05:48:02       11 阅读
  9. AlgorithmDay20

    2024-04-24 05:48:02       11 阅读