a依赖b,b依赖a
先尝试获取bean,到bean工厂,bean工厂到bean的仓库取,有就返回,没有就创建
解决循环依赖需要用到三级缓存;
bean处理器调用AOP处理器,创建代理对象,有一个提前处理和一个后置处理的方法;
先getBean,实例化,填充属性,初始化,代理:先调用提前处理,提前暴露,先把factory(A)放入三级缓存(调用提前处理方法),先把代理A放入单例池里;
bean由beanDefintion来的,beanDefintion是一个建模的类
首先spring容器启动,它会做一个扫描,会把它变成beanDefintion存到beanDefintion Map当中,然后对beanDefintion做遍历,进行验证(是否单例,是否原型,是否懒加载等等)
验证完之后去单例池看看是否存在,是否提前暴露,没有就开始创建,存在就直接返回
首先 实例化java对象,然后做初始化工作,看它是否支持循环依赖,如果支持会提前暴露一个当前对象的ObjectFactoy(A)对象;存入二级缓存里;
之后继续做属性填充,这时候就发现引用到B,开始创建B,实例化之后暴露B,然后属性填充填充A,这个时候A并没有走完不在单例池里面,这个时候去走A的创建流程,这个给时候发现A已经提前暴露,
就拿到了A对象的ObjectFactory;然后B就走完了,接着返回到A。
为什么不直接缓存A对象,而是缓存ObjectFactoryA呢?
直接返回的是A对象,那么我们就很难对A进行扩展和改变,如果暴露的是ObjectFactory,我们可以通过beanPostProcessor能够对bean进行一些进行一些处理