Spring解决循环依赖不使用二级缓存的真正原因

反证法:假设使用二级缓存,且二级缓存存放工厂对象

证明方法1

  1. 条件:

    1. A有属性B
    2. A的工厂对象生成代理对象A1
    3. A初始化生成代理对象A2
  2. 证明过程:

    1. 实例化
      1. 实例化A
      2. 二级缓存中放入A的工厂对象
    2. 属性注入
      1. 创建B
      if(存在循环依赖(B有A属性)){
          实例化B;
          B.A=A1(工厂对象生成A1);
          初始化B;
      }else{
          实例化B
          初始化B
      }
      
      1. A.B=B
    3. 初始化
      1. 初始化A,生成A2

    循环依赖的情况:A1有引用,不能使用A2,所以应该抛出异常
    无循环依赖的情况:无A1,使用A2没有问题

    由于在创建完A之后无法判断是否有循环依赖,就无法判断是应该使用A2还是抛出异常

  3. 结论:
    三级缓存中二级缓存的目的是判断是否有循环依赖的,二级缓存无bean说明没有循环依赖,二级缓存中有bean说明有缓存依赖

证明方法2

  1. 条件:

    1. B有属性A
    2. C有属性A
    3. A的工厂对象第一次生成代理对象A1
    4. A的工厂对象第一次生成代理对象A2
    5. A有属性B
    6. A有属性C
  2. 证明过程:

    1. 实例化
      1. 实例化A
      2. 二级缓存中放入A的工厂对象
    2. 属性注入
      1. 创建B
          实例化B;
          B.A=A1(工厂对象生成A1);
          初始化B;
      
      1. A.B=B
      2. 创建C
          实例化C;
          C.A=A2(工厂对象生成A2);
          初始化C;
      
      1. A.C=C
    3. 初始化
      1. 初始化A
        A有两个对象A1,A2 这时不应该出现的
  3. 结论:
    三级缓存中二级缓存的目的是防止工厂对象生产多个对象

你可能感兴趣的:(Spring,spring,java)