前言
网上很多说spring 为什么用三级缓存是而不是二级缓存的原因是因为AOP,我认为这种说法对也不对
下面的文章默认你对spring循环依赖有一定的理解
spring 共有三级缓存来解决循环依赖:singletonObjects(第一级缓存,也叫单例池),earlySingletonObjects(第二级缓存),singletonFactories(第三级缓存)
我简单的说一下不用三级缓存会有什么问题,从而理解为什么要用三级缓存
只用 singletonObjects 实现循环依赖
A类
@Component
@Transactional
public class A {
@Autowired
private B b;
}
@Component
public class B {
@Autowired
private B A;
}
//这是伪代码方便理解
public Object doCreateBean(Class clazz){
//实例化
Object bean = createBeanInstance(clazz)
//提前AOP
object exposedObject = bean
exposedObject = getEarlyBeanReference(exposedObject, beanName)
//放入到单例池
singletonObjects.put(beanName,exposedObject)
//依赖注入
populateBean(bean)
}
如果这样写发现其实一级缓存也可以实现循环依赖,同时也可以解决AOP
那么为什么要用三级缓存
我更加愿意理解为这是一种设计,为了安全和可扩展性的设计
1.singletonObjects 是放spring成品bean的,而我们这个是虽然最终放的也是成品bean,但是中途是半成品,这样有线程安全问题
2.spring 设计是在有循环依赖的情况下才提前暴露,这样设计可以增加扩展性,我们是都提前暴露,扩展性查些