SpringIOC循环依赖与三级缓存
Spring解决循环依赖的核心机制就是通过三级缓存:
- 一级缓存(singletonObjects):存储完全初始化好的Bean;
- 二级缓存(earlySingletonObjects):存储原始实例,也就是初始化完成单还未注入属性的Bean;
- 三级缓存(singletonFactories):存储ObjectFactories,用于生成Bean的代理对象或原始对象;
SpringIOC循环依赖:
1、invokeBeanFactoryPostPorcessors读取xml或注解配置,将Bean信息以对象的形式加载到BeanDefinitionMap<BeanName,BeanDefinition>
2、BeanFactory获取对象,先查询一级缓存是否存在,不存在则开始创建Bean。
3、实例化:通过反射类的字节码文件,获取构造器,创建对象实例,并存入三级缓存半成品(即未注入)
4、依赖注入:注入B时,先通过BeanFactory判断一级缓存是否存在,不存在则创建;
5、B创建好后也存入三级缓存。需要注入A属性,从1 2 3级缓存中寻找,三级缓存找到,即注入,注入成功B继续初始化操作,如果有AOP切面(BeanPostProcessor.beforeXX,BeanPostProcessor.afterXX),生成代理类,存入一级缓存,B成品;
6、B完成全部操作之前,会将A从三级缓存移动到二级缓存。操作完成以后,会同步删除三级缓存中的BObjectFactory
步删除三级缓存中的BObjectFactory
7、A继续注入操作,可以从一级缓存直接获取成品B,注入属性,初始化,如果有AOP,生成代理类,完成A创建,存入一级缓存,删除二级缓存;