spring循环依赖

自己复习使用。

Spring解决循环依赖,依赖三级缓存机制,第一级 存放经历完整生命周期的bean,第二级 存放提前暴露的bean,没有经历过初始化的步骤,在实例化后,填充属性前提前暴露,第三级,存放生产bean的bean工厂。

为什么需要三级缓存?

如果是普通的bean,无需进行的代理的话,那么我们两级缓存就可以实现。如果需要代理的话,还是两级缓存机制,那么就违反了正常的aop机制增加bean的时机,在正常情况下,aop机制,依赖bean的后置处理器,在初始化方法的调用aware方法,初始化方法之后,进行增强的,所依赖的组件就是@EnableAspectAutoProxy通过@import注解注入的AbstractAutoProxyCreator类实现的。这个类属于SmartInstantiationAwareBeanPostProcessor后置处理器。会调用其方法,进行代理增强,而二级缓存机制,如果要满足代理的功能,则需要对每一个实例化后bean进行代理,因为spring在加载的时候,无法确定其bean是否需要代理,是否循环依赖了,这样就改变了原有的spring加载bean的流程。加了三级缓存,只有在循环依赖的情况下,并且需要代理的时候,才提前创建代理对象暴露出来。

GetBean->doGetBean->

再此方法中,会调用getSingleton方法,此获取bean的方法如果一级二级缓存没有,会直接去三级缓存中去拿,拿到直接返回。没有拿到的话,调用第二个getSingleton方法,再此方法中,会首先加锁,并标记bean正在创建,然后通过singtelonFactory的getObject方法,激活creatbean方法,创建完成之后bean正在创建标识,如果是新创建的bean将bean加入到一级缓存中。

createBean->doCreateBean

addSingletonFactory()方法在第一个getSingleton方法中的singletonObject = singletonFactory.getObject()方法调用时触发。

第二个this.getSingleton()方法会在其调用singletonObject = singletonFactory.getObject()时,触发createBean()方法。

通过三级缓存无法解决通过构造器注入和原型模式下的循环依赖。

你可能感兴趣的:(spring循环依赖)