spring 中为了解决 B的重复利用,A 依赖B 的循环依赖,aop 问题,多线程可能拿到不完整的bean 的问题引入了3层缓存,分别是
/** Cache of singleton objects: bean name to bean instance. */
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);
/** Cache of early singleton objects: bean name to bean instance. */
private final Map<String, Object> earlySingletonObjects = new HashMap<>(16);
/** Cache of singleton factories: bean name to ObjectFactory. */
private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);
- singletonObjects 用于存放单例bean 实例
- earlySingletonObjects 用于存放早期的bean 实例
- singletonFactories 用于存放简单工厂实例
从3级缓存中 获取bean 的方法有如下两个
1.从缓存中获取,主要用来解决循环依赖问题
protected Object getSingleton(String beanName, boolean allowEarlyReference) {
// 这里不用考虑指令重排,因为 bean 初始化完成后才会放入map
Object singletonObject = this.