Spring循环依赖

二级缓存的作用是确保生成的代理对象是唯一的,不能生成多个不同的代理对象

AService:

  1. 实例化AService(new AService()) --> AService原始对象 --> 第三级缓存 <aService, AService的原始对象>

  1. 填充bService属性 --> 从单例池 --> 找不到 --> 创建 BService对应的Bean

  2. 填充cService属性 --> 从单例池 --> 找不到 --> 创建 CService对应的Bean

  3. 初始化后(AOP) --> aService代理对象

  4. 从二级缓存中取出AService的代理对象

  5. 添加单例池(第一级缓存)

 

BService:

  1. 实例化BService(new BService()) --> BService原始对象

  1. 填充aService属性 --> 从单例池 --> 找不到 --> 二级缓存 --> 找不到且发现依赖的aService正在创建中(发生了循环依赖) --> AOP 生成 aService 代理对象(从第三级缓存中拿到AService原始对象,用来做AOP) --> 将代理对象放入第二级缓存earlySingletonObjects<aService,AService代理对象>中

  2. 填充其他属性

  3. 初始化后

  4. 添加单例池(第一级缓存)

 

CService:

  1. 实例化CService(new CService()) --> BService原始对象

  1. 填充aService属性 --> 从单例池找 aService 对应的Bean --> 找不到 --> 二级缓存找 --> 找到AService代理对象

  2. 填充其他属性

  3. 初始化后

  4. 添加单例池(第一级缓存)

原文地址:https://www.cnblogs.com/panning/p/13946760.html