spring三级缓存

第一级缓存:singletonObjects

第二级缓存:earlySingletonObjects

第三级缓存:singletonFactories

先从“第一级缓存”找对象,有就返回,没有就找“二级缓存”;

找“二级缓存”,有就返回,没有就找“三级缓存”;

找“三级缓存”,找到了,就获取对象,放到“二级缓存”,从“三级缓存”移除。

 

  1. 在第一层中,先去获取 A 的 Bean,发现没有就准备去创建一个,然后将 A 的代理工厂放入“三级缓存”(这个 A 其实是一个半成品,还没有对里面的属性进行注入),但是 A 依赖 B 的创建,就必须先去创建 B;
  2. 在第二层中,准备创建 B,发现 B 又依赖 A,需要先去创建 A;
  3. 在第三层中,去创建 A,因为第一层已经创建了 A 的代理工厂,直接从“三级缓存”中拿到 A 的代理工厂,获取 A 的代理对象,放入“二级缓存”,并清除“三级缓存”;
  4. 回到第二层,现在有了 A 的代理对象,对 A 的依赖完美解决(这里的 A 仍然是个半成品),B 初始化成功;
  5. 回到第一层,现在 B 初始化成功,完成 A 对象的属性注入,然后再填充 A 的其它属性,以及 A 的其它步骤(包括 AOP),完成对 A 完整的初始化功能(这里的 A 才是完整的 Bean)。
  6. 将 A 放入“一级缓存”。

一级缓存 :可以用大的

二级缓存:半成本,未对属性赋值  未初始化未填充属性提前暴露的Bean

singletonFactories:三级缓存,存储生产单实例Bean的工厂 

 

只需要一级和三级缓存也可以做到解决循环依赖的问题

只要两个缓存确实可以做到解决循环依赖的问题,但是有一个前提这个bean没被AOP进行切面代理,如果这个bean被AOP进行了切面代理,那么只使用两个缓存是无法解决问题,下面来看一下bean被AOP进行了切面代理的场景

 

所以如果没有AOP的话确实可以两级缓存就可以解决循环依赖的问题,如果加上AOP,两级缓存是无法解决的,不可能每次执行singleFactory.getObject()方法都给我产生一个新的代理对象,所以还要借助另外一个缓存来保存产生的代理对象

 

posted @ 2024-05-05 10:25  沙漠里的小鱼  阅读(23)  评论(0编辑  收藏  举报