26、Spring是如何解决Bean的循环依赖?

Spring是如何解决Bean的循环依赖?

采用三级缓存解决的 就是三个Map ; 关键: 一定要有一个缓存保存它的早期对象作为死循环的出口

  1. 一级缓存:存储完整的Bean
  2. 二级缓存: 避免多重循环依赖的情况 重复创建动态代理。
  3. 三级缓存:
  • a. 缓存是函数接口:通过lambda 把方法传进去( 把Bean的实例和Bean名字传进去(aop创建) )
  • b. 不会立即调:(如果在实例化后立即调用的话:所有的aop 不管bean是否循环依赖都会在 实例化后创建
    proxy, 正常Bean 其实spring还是希望遵循生命周期在初始化创建动态代理, 只能循环依赖才创建)
  • c. 会在 ABA (第二次getBean(A) 才会去调用三级缓存(如果实现了aop才会创建动态代理,如果没有实现
    依然返回的Bean的实例))
  • d. 放入二级缓存(避免重复创建)

夺命连环问:

  1. 二级缓存能不能解决循环依赖?

    • a. 如果只是死循环的问题: 一级缓存就可以解决 :无法避免在并发下获取不完整的Bean?
    • b. 二级缓存也可以解决循环依赖: 只不过如果出现重复循环依赖 会多次创建aop的动态代理
  2. Spring有没有解决多例Bean的循环依赖?

    • a. 多例不会使用缓存进行存储(多例Bean每次使用都需要重新创建)
    • b. 不缓存早期对象就无法解决循环
  3. Spring有没有解决构造函数参数Bean的循环依赖?

    • a. 构造函数的循环依赖也是会报错
    • b. 可以通过人工进行解决:@Lazy
      i. 就不会立即创建依赖的bean了
      ii. 而是等到用到才通过动态代理进行创建

相关推荐

  1. 26Spring如何解决Bean循环依赖

    2023-12-06 21:52:05       57 阅读
  2. Spring 如何解决 Bean 循环依赖

    2023-12-06 21:52:05       28 阅读
  3. Spring循环依赖问题如何解决

    2023-12-06 21:52:05       35 阅读
  4. Spring如何解决循环依赖

    2023-12-06 21:52:05       46 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-06 21:52:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-06 21:52:05       101 阅读
  3. 在Django里面运行非项目文件

    2023-12-06 21:52:05       82 阅读
  4. Python语言-面向对象

    2023-12-06 21:52:05       91 阅读

热门阅读

  1. gstreamer插件开发-What are states?

    2023-12-06 21:52:05       38 阅读
  2. C#WPF使用MaterialDesign 显示带遮罩的对话框

    2023-12-06 21:52:05       54 阅读
  3. 统计英语单词

    2023-12-06 21:52:05       43 阅读
  4. [传智杯 #4 初赛] 萝卜数据库

    2023-12-06 21:52:05       53 阅读
  5. AtCoder ABC172

    2023-12-06 21:52:05       56 阅读