Bean容器的三个缓存:
一级缓存(singletonObjects)-256:单例,用于保存我们创建完成的bean对象。
二级缓存(earlysingletonObjects)-16:单例,用于保存我们的实例化 但是未进行属性注入及初始化的对象
三级缓存(singletonFactories)-16:单例,主要用于解决循坏依赖,存储bean对象的单例工厂。
图中为getBean方法源码:
执行顺序:1、去一级缓存首先尝试获取对象
2、对象不存在 且 工厂中关于对象创建中的一个set缓存中存有beanName。
3、去三级缓存中获取单例的工厂,然后通过此工厂获取对象,存入到二级缓存中,并删除三级缓存中的此对象,返回此对象。
循环依赖的解决过程(A、B相互依赖):
1、首先去创建对象A,注入属性阶段时,去创建B对象,B对象也进入属性注入阶段,去getBean(A)。
2、这个时候 按照一级 二级 三级的顺序去获取对象A,实际对象A的beanName创建工厂暴露在了三级缓存中,通过获取此工厂的getBean方法,会执行对原对象的代理操作,使得我们得到的对象引用是代理类,而不是原对象的。
三级缓存,不用二级缓存:三级缓存,中间在getBean对象的时候会做一个代理。