Spring 三级缓存

2022-02-22  本文已影响0人  蓝笔头

简介

package org.springframework.beans.factory.support;

public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry {
    /** Cache of singleton objects: bean name to bean instance. */
    private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);

    /** Cache of singleton factories: bean name to ObjectFactory. */
    private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);

    /** Cache of early singleton objects: bean name to bean instance. */
    private final Map<String, Object> earlySingletonObjects = new ConcurrentHashMap<>(16);
}

缓存初始化时机

    protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
            throws BeanCreationException {
        // 1. 实例化 Bean 对象
        BeanWrapper instanceWrapper = createBeanInstance(beanName, mbd, args);
        
        // 2. 把用 lambda 表达式 表示的 ObjectFactory,添加到 singletonFactories 缓存
        addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
        
        // Initialize the bean instance.
        Object exposedObject = bean;
        try {
            // 3. 填充 Bean 对象的属性  
            populateBean(beanName, mbd, instanceWrapper);
            exposedObject = initializeBean(beanName, exposedObject, mbd);
        }
        return exposedObject;
    }
    protected Object getSingleton(String beanName, boolean allowEarlyReference) {
        Object singletonObject = this.singletonObjects.get(beanName);
        if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
            synchronized (this.singletonObjects) {
                singletonObject = this.earlySingletonObjects.get(beanName);
                if (singletonObject == null && allowEarlyReference) {
                    // 1. 获取到 ObjectFactory 缓存
                    ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
                    if (singletonFactory != null) {
                        // 2. 通过 `getEarlyBeanReference()` 方法得到 AOP 增强的代理对象
                        singletonObject = singletonFactory.getObject();

                        // 3. 将 AOP 增强的代码对象存放到 earlySingletonObjects 缓存中
                        this.earlySingletonObjects.put(beanName, singletonObject);
                        this.singletonFactories.remove(beanName);
                    }
                }
            }
        }
        return singletonObject;
    }

参考

上一篇 下一篇

猜你喜欢

热点阅读