spring:我是如何解决循环依赖的?

  • 一级缓存:存储完整Bean
  • 二级缓存:防止AOP时DP对象被重复创建
  • 三级缓存:防止循环依赖,实际上是函数式接口,不会被立刻调用

    • 会在ABA(实际上是属性赋值时)时创建DP,但正常Bean是在属性赋值完后的初始化时创建DP

      问题

      是否需要三级缓存?

  • 仅解决依赖,一级缓存足矣,但不能避免并发状况下获取不完整bean的问题

  • 二级缓存可以解决上述问题,但无法解决多次循环依赖情况下重复创建动态代理的问题

    若干多例bean能否解决循环依赖?

    不能,
    理论上因为不能确定一个实例依赖另一类实例中的具体哪一个。
    事实上多例bean不会使用缓存

    没有无参构造函数是能否解决循环依赖?

    不能,因为构造函数循环依赖也会报错,循环依赖的解决倚仗与拿到早期未初始化的、不完整的bean对象做占位用,但构造函数期望拿到完整的bean,所以必然不能循环依赖。
    但能通过为构造函数添加@Lazy注解实现循环依赖