了解Spring三级缓存
Spring三级缓存
一级缓存:实例化完成的东西
二级缓存:半实例化的对象,未完全注入属性的对象
三级缓存:工厂
问题:
Q1:循环依赖问题怎么解决?E: A依赖于B,B依赖于A
- 首先将循环依赖的对象,依次存放在三级缓存(工厂)中,
- 通过AOP、动态代理,在初始对象未变的情况下,创建出相应的动态代理对象,借此动态代理对象创建一个初始化对象
- 初始化对象完之后,将第一个初始化对象放在二级缓存中,三级缓存中的初始对象被删除
- 当依赖于第一个初始化对象的第二个对象需要在三级缓存中创建一个对象时,因为第一个对象已经创建并存放在二级缓存中,所以第二个对象会直接创建,并且将该对象实例化后,放入一级缓存。
- 第一个对象依赖的第二个对象已经实例化完成,所以第一个对象也会实例化完后,存入一级缓存。
- 循环以来对象越多,以此类推。
- 再一个个拿出来,对该对象进行初始化和实例化
spring设计原理:实例化之后,才创建代理对象
-
三级缓存存在的意义:
- 如果放在二级缓存中,对象会在创建之前创建代理对象。若不设置三级缓存,将对象放在二级缓存中,则会违背spring设计原理。