think in spring refresh 11

refresh方法的第11步:    核心方法 

  实例化所有剩余的非懒加载的单例。

// Instantiate all remaining (non-lazy-init) singletons.
finishBeanFactoryInitialization(beanFactory);
/**
     * Finish the initialization of this context's bean factory,
     * initializing all remaining singleton beans.
     */
    protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
        // Initialize conversion service for this context.
// 什么作用??? <<<<
if (beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME) && beanFactory.isTypeMatch(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class)) { beanFactory.setConversionService( beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class)); } // Register a default embedded value resolver if no bean post-processor // (such as a PropertyPlaceholderConfigurer bean) registered any before: // at this point, primarily for resolution in annotation attribute values.
// 注册嵌入值解析器, 主要用于注解属性值的解析。 注解属性值的解析是什么 ??? <<<<
if (!beanFactory.hasEmbeddedValueResolver()) { beanFactory.addEmbeddedValueResolver(strVal -> getEnvironment().resolvePlaceholders(strVal)); } // Initialize LoadTimeWeaverAware beans early to allow for registering their transformers early.
// 下面创建的这个 bean实例的主要作用是什么?
String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false); for (String weaverAwareName : weaverAwareNames) { getBean(weaverAwareName); // 实例化 } // Stop using the temporary ClassLoader for type matching.

beanFactory.setTempClassLoader(null); // Allow for caching all bean definition metadata, not expecting further changes.

// 冻结所有的 bean 定义 , 注册的 bean定义不会被进一步修改, 因为即将创建bean实例了 beanFactory.freezeConfiguration(); // Instantiate all remaining (non-lazy-init) singletons. beanFactory.preInstantiateSingletons(); // 实例化所有剩余的非懒加载的单例 }

DefaultListableApplcationContext中的方法:

@Override
    public void preInstantiateSingletons() throws BeansException {
        if (logger.isTraceEnabled()) {  // 日志打印
            logger.trace("Pre-instantiating singletons in " + this);
        }

        // Iterate over a copy to allow for init methods which in turn register new bean definitions.
        // While this may not be part of the regular factory bootstrap, it does otherwise work fine.
        List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);   // 创建一个list,用于存储所有beanName副本

        // Trigger initialization of all non-lazy singleton beans...
        for (String beanName : beanNames) {    // 遍历所有的  BeanName, 创建对应的bean实例
// 出现过好几次 RootBeanDefinition bd
= getMergedLocalBeanDefinition(beanName); // 获得RootBeanDefinition // 看refresh 6 在那里做了解释
// 如果 不是抽象类 是单例的 不是懒加载
if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
// 判断是否为 FactoryBean ,
if (isFactoryBean(beanName)) { // 1
// 创建FactoryBean的实例 工厂bean 的 beanName 会有一个前缀 & Object bean
= getBean(FACTORY_BEAN_PREFIX + beanName); if (bean instanceof FactoryBean) { FactoryBean<?> factory = (FactoryBean<?>) bean;
// 判断这个FactoryBean是否希望现在初始化 ?? FactoryBean 里面会创建其它的 bean 实例
boolean isEagerInit; if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) { isEagerInit = AccessController.doPrivileged( (PrivilegedAction<Boolean>) ((SmartFactoryBean<?>) factory)::isEagerInit, getAccessControlContext()); } else { isEagerInit = (factory instanceof SmartFactoryBean && ((SmartFactoryBean<?>) factory).isEagerInit()); } if (isEagerInit) { getBean(beanName); } } } else { getBean(beanName); // 如果不是FactoryBean,则直接创建bean实例即可。 } } } // Trigger post-initialization callback for all applicable beans...

// 遍历所有的 beanName, 拿到对应的bean实例,如果该bean实现了 SmartInitializingSingleton接口, 调用bean 中的 aferSingletonsInstantiated 方法 for (String beanName : beanNames) { Object singletonInstance = getSingleton(beanName); if (singletonInstance instanceof SmartInitializingSingleton) { SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance; if (System.getSecurityManager() != null) { AccessController.doPrivileged((PrivilegedAction<Object>) () -> { smartSingleton.afterSingletonsInstantiated(); return null; }, getAccessControlContext()); } else { smartSingleton.afterSingletonsInstantiated(); // } } } }

1  AbstractBeanFactory 中的方法: 

    @Override
    public boolean isFactoryBean(String name) throws NoSuchBeanDefinitionException {
// 得到真正的 beanName String beanName
= transformedBeanName(name);
// Object beanInstance
= getSingleton(beanName, false); // 1.1
// 如果bean被创建出来了,返回它是否为 FactoryBean
if (beanInstance != null) { return (beanInstance instanceof FactoryBean); } // No singleton instance found -> check bean definition.

// 如果 该 beanFactory中不存在此beanName 并且父BeanFactory 是 ConfigurablleBeanFactory类型 if (!containsBeanDefinition(beanName) && getParentBeanFactory() instanceof ConfigurableBeanFactory) { // No bean definition found in this factory -> delegate to parent.

// 通过父BeanFactory 来判断它是否为 FactoryBean return ((ConfigurableBeanFactory) getParentBeanFactory()).isFactoryBean(name); }
//
return isFactoryBean(beanName, getMergedLocalBeanDefinition(beanName)); // 1.2 }

  1.1  DefaultSingletonBeanRegistry 中的方法:

  protected Object getSingleton(String beanName, boolean allowEarlyReference) {   // 这里 第二个参数 传入的是 false
        // Quick check for existing instance without full singleton lock
        Object singletonObject = this.singletonObjects.get(beanName);     //  先从一级缓存中获取 bean 实例
        if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {  // 一级缓存中没有该 bean实例,并且 该bean正在创建中
            singletonObject = this.earlySingletonObjects.get(beanName);  //  从二级缓存中获取
            if (singletonObject == null && allowEarlyReference) {
                synchronized (this.singletonObjects) {
                    // Consistent creation of early reference within full singleton lock
                    singletonObject = this.singletonObjects.get(beanName);
                    if (singletonObject == null) {
                        singletonObject = this.earlySingletonObjects.get(beanName);
                        if (singletonObject == null) {
                            ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
                            if (singletonFactory != null) {
                                singletonObject = singletonFactory.getObject();
                                this.earlySingletonObjects.put(beanName, singletonObject);
                                this.singletonFactories.remove(beanName);
                            }
                        } 
                    }
                }
            }
        }
        return singletonObject;
    }

1.2   根据 beanName 和 RootBeanDefinition 来判断是否为 FactoryBean。 

    protected boolean isFactoryBean(String beanName, RootBeanDefinition mbd) {
        Boolean result = mbd.isFactoryBean;   
        if (result == null) {
            Class<?> beanType = predictBeanType(beanName, mbd, FactoryBean.class);   // 1.2.1
            result = (beanType != null && FactoryBean.class.isAssignableFrom(beanType));
            mbd.isFactoryBean = result;
        }
        return result;
    }

1.2.1  AbstractBeanFactory 的方法:  但是这里用的不是这个

    @Nullable
    protected Class<?> predictBeanType(String beanName, RootBeanDefinition mbd, Class<?>... typesToMatch) {
        Class<?> targetType = mbd.getTargetType();   
        if (targetType != null) {
            return targetType;
        }
        if (mbd.getFactoryMethodName() != null) {
            return null;
        }
        return resolveBeanClass(mbd, beanName, typesToMatch);
    }

1.2.1    AbstractAutowireCapableBeanFactory.

protected Class<?> predictBeanType(String beanName, RootBeanDefinition mbd, Class<?>... typesToMatch) {
// 获取生成的bean的类型 Class
<?> targetType = determineTargetType(beanName, mbd, typesToMatch); // Apply SmartInstantiationAwareBeanPostProcessors to predict the // eventual type after a before-instantiation shortcut.

// SmartInstantiationAwreBeanPostProcessor 继承了 InstantiationAwareBeanPostProcessor
// InstantiationAwareBeanPostProcessor 的 postProcessBeforeInstantiation 方法可以改变 Bean 实例的类型
// 通过 SmartInstantiationAwareBeanPostProcesspr 的 predictBeanType 方法可以预测这个bean最终的类型 if (targetType != null && !mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) { boolean matchingOnlyFactoryBean = typesToMatch.length == 1 && typesToMatch[0] == FactoryBean.class; for (BeanPostProcessor bp : getBeanPostProcessors()) { if (bp instanceof SmartInstantiationAwareBeanPostProcessor) { SmartInstantiationAwareBeanPostProcessor ibp = (SmartInstantiationAwareBeanPostProcessor) bp; Class<?> predicted = ibp.predictBeanType(targetType, beanName); if (predicted != null && (!matchingOnlyFactoryBean || FactoryBean.class.isAssignableFrom(predicted))) { return predicted; } } } } return targetType; }

 

------------------------------------------------

getBean.

    @Override
    public Object getBean(String name) throws BeansException {
        return doGetBean(name, null, null, false);
    }

doGetBean. 

  protected <T> T doGetBean(
            String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly)
            throws BeansException {
// 获得beanName的真正名字,如果是工厂bean,也就是beanName的前面有 & 前缀,那么删去这个前缀,也就是得到工厂bean中要创建的bean的beanName;
// 如果当前beanName是个别名,那么获取它的真正的名字 String beanName
= transformedBeanName(name); Object bean; // Eagerly check singleton cache for manually registered singletons. Object sharedInstance = getSingleton(beanName); // 3 从 一级 二级 三级 缓存中尝试获取bean
// 如果从缓存中获取到了 bean实例,则进行日志的打印
if (sharedInstance != null && args == null) { if (logger.isTraceEnabled()) { if (isSingletonCurrentlyInCreation(beanName)) { logger.trace("Returning eagerly cached instance of singleton bean '" + beanName + "' that is not fully initialized yet - a consequence of a circular reference"); } else { logger.trace("Returning cached instance of singleton bean '" + beanName + "'"); } }
// 对于 FactoryBean, 通过下面方法会进行进一步处理 待进一步看代码 bean
= getObjectForBeanInstance(sharedInstance, name, beanName, null); // 4 } else { // Fail if we're already creating this bean instance: // We're assumably within a circular reference.

// 进行 scope 为 prototype的 循环依赖校验 不允许原型模式存在循环依赖。 if (isPrototypeCurrentlyInCreation(beanName)) { throw new BeanCurrentlyInCreationException(beanName); } // Check if bean definition exists in this factory. BeanFactory parentBeanFactory = getParentBeanFactory(); // 获取父BeanFactory if (parentBeanFactory != null && !containsBeanDefinition(beanName)) { // 如果父BeanFactory存在,并且当前 BeanFactory不存在该beanName的定义 // Not found -> check parent. String nameToLookup = originalBeanName(name); // 将别名解析成真正的名字,如果name的前缀有 & ,那么这里得到的结果的前缀也有 &
// 尝试通过 父 BeanFactory 来获取 bean 实例
if (parentBeanFactory instanceof AbstractBeanFactory) { return ((AbstractBeanFactory) parentBeanFactory).doGetBean( nameToLookup, requiredType, args, typeCheckOnly); }
// 这里 为空
else if (args != null) { // Delegation to parent with explicit args. return (T) parentBeanFactory.getBean(nameToLookup, args); }
// 这里为空
else if (requiredType != null) { // No args -> delegate to standard getBean method. return parentBeanFactory.getBean(nameToLookup, requiredType); } else { return (T) parentBeanFactory.getBean(nameToLookup); } } if (!typeCheckOnly) { // typeCheckOnly 为false, 整个判断为 true
// 如果不仅仅是做类型检测,而是要创建bean实例,那么这里将beanName 放到 缓存中 做类型检测就怎么保证了不创建bean实例呢 markBeanAsCreated(beanName); // 5 }
try {
// 再次获取 RootBeanDefinition ? 为什么需要再次获取呢??? <<<<<<< RootBeanDefinition mbd
= getMergedLocalBeanDefinition(beanName);
// 其实就是检测mbd是不是抽象的 checkMergedBeanDefinition(mbd, beanName, args);
// Guarantee initialization of beans that the current bean depends on.

// 获取当前 bean 所依赖的bean集合,在实例化自己之前,需要先实例化 当前bean 依赖的 bean, 这里的依赖指的是什么?? 父类吗? <<<< String[] dependsOn = mbd.getDependsOn(); if (dependsOn != null) { for (String dep : dependsOn) {
// 检测 dep是否依赖 beanName, 即检测是否存在循环依赖
if (isDependent(beanName, dep)) { throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Circular depends-on relationship between '" + beanName + "' and '" + dep + "'"); }
// 将 dep和 beanName的依赖关系注册到缓存中 为啥要注册到缓存中呢???哪里用到了呢?? <<<<<<
registerDependentBean(dep, beanName);
try {
// 获取 beanName 依赖的 dep 的实例 getBean(dep); }
catch (NoSuchBeanDefinitionException ex) { throw new BeanCreationException(mbd.getResourceDescription(), beanName, "'" + beanName + "' depends on missing bean '" + dep + "'", ex); } } } // 见 think in spring refresh 11 - 2 // Create bean instance. if (mbd.isSingleton()) { sharedInstance = getSingleton(beanName, () -> { // 6 try { return createBean(beanName, mbd, args); } catch (BeansException ex) { // Explicitly remove instance from singleton cache: It might have been put there // eagerly by the creation process, to allow for circular reference resolution. // Also remove any beans that received a temporary reference to the bean. destroySingleton(beanName); throw ex; } }); bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd); } else if (mbd.isPrototype()) { // It's a prototype -> create a new instance. Object prototypeInstance = null; try { beforePrototypeCreation(beanName); prototypeInstance = createBean(beanName, mbd, args); } finally { afterPrototypeCreation(beanName); } bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd); } else { String scopeName = mbd.getScope(); if (!StringUtils.hasLength(scopeName)) { throw new IllegalStateException("No scope name defined for bean ´" + beanName + "'"); } Scope scope = this.scopes.get(scopeName); if (scope == null) { throw new IllegalStateException("No Scope registered for scope name '" + scopeName + "'"); } try { Object scopedInstance = scope.get(beanName, () -> { beforePrototypeCreation(beanName); try { return createBean(beanName, mbd, args); } finally { afterPrototypeCreation(beanName); } }); bean = getObjectForBeanInstance(scopedInstance, name, beanName, mbd); } catch (IllegalStateException ex) { throw new BeanCreationException(beanName, "Scope '" + scopeName + "' is not active for the current thread; consider " + "defining a scoped proxy for this bean if you intend to refer to it from a singleton", ex); } } } catch (BeansException ex) { cleanupAfterBeanCreationFailure(beanName); throw ex; } } // Check if required type matches the type of the actual bean instance. if (requiredType != null && !requiredType.isInstance(bean)) { try { T convertedBean = getTypeConverter().convertIfNecessary(bean, requiredType); if (convertedBean == null) { throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass()); } return convertedBean; } catch (TypeMismatchException ex) { if (logger.isTraceEnabled()) { logger.trace("Failed to convert bean '" + name + "' to required type '" + ClassUtils.getQualifiedName(requiredType) + "'", ex); } throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass()); } } return (T) bean; }

3   DefaultSingletonBeanRegistry 中的方法。

  @Override
    @Nullable
    public Object getSingleton(String beanName) {
        return getSingleton(beanName, true);   // 这里传入的是 true
    }

 DefaultSingletonBeanRegistry 中的 getSingleton方法

protected Object getSingleton(String beanName, boolean allowEarlyReference) {
        // Quick check for existing instance without full singleton lock
        Object singletonObject = this.singletonObjects.get(beanName);    // 先从一级缓存中进行获取
// 如果没有从一级缓存中获取到 bean实例, && 该bean正在创建过程中 什么时候将 beanName 添加到了正在创建bean的set集合中的?? <<<<<<
if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) { singletonObject = this.earlySingletonObjects.get(beanName); // 从二级缓存中进行获取
// 如果没有从二级缓存中获取到,并且允许早期引用
if (singletonObject == null && allowEarlyReference) { synchronized (this.singletonObjects) { // Consistent creation of early reference within full singleton lock singletonObject = this.singletonObjects.get(beanName); if (singletonObject == null) { singletonObject = this.earlySingletonObjects.get(beanName); if (singletonObject == null) {
// 上面加锁后 怎么又从一级缓存和二级缓存中 获取了一次 ??? ObjectFactory
<?> singletonFactory = this.singletonFactories.get(beanName); // 从三级缓存中获取 if (singletonFactory != null) {
// 从三级缓存中获取 对象 也就是通过单例工厂来创建一个对象,这里有可能创建的不是bean本身 singletonObject
= singletonFactory.getObject();
// 将获取到的对象添加到二级缓存中
this.earlySingletonObjects.put(beanName, singletonObject);
// 从三级缓存中移除掉 该对象
this.singletonFactories.remove(beanName); } } } } } } return singletonObject; }

4

  protected Object getObjectForBeanInstance(
            Object beanInstance, String name, String beanName, @Nullable RootBeanDefinition mbd) {

        // Don't let calling code try to dereference the factory if the bean isn't a factory.
        if (BeanFactoryUtils.isFactoryDereference(name)) {  // 如果是工厂 bean,那么name肯定是以 & 开头,怎么还会执行后面的语句 ????<<<<<
            if (beanInstance instanceof NullBean) {
                return beanInstance;
            }
            if (!(beanInstance instanceof FactoryBean)) {
                throw new BeanIsNotAFactoryException(beanName, beanInstance.getClass());
            }
            if (mbd != null) {
                mbd.isFactoryBean = true;
            }
            return beanInstance;
        }

        // Now we have the bean instance, which may be a normal bean or a FactoryBean.
        // If it's a FactoryBean, we use it to create a bean instance, unless the
        // caller actually wants a reference to the factory.
        if (!(beanInstance instanceof FactoryBean)) {
            return beanInstance;
        }

        Object object = null;
        if (mbd != null) {
            mbd.isFactoryBean = true;
        }
        else {
            object = getCachedObjectForFactoryBean(beanName);  // 4.1   先尝试从缓存中获取
        }
        if (object == null) {
            // Return bean instance from factory.
            FactoryBean<?> factory = (FactoryBean<?>) beanInstance;
            // Caches object obtained from FactoryBean if it is a singleton.
            if (mbd == null && containsBeanDefinition(beanName)) {
                mbd = getMergedLocalBeanDefinition(beanName);
            }
            boolean synthetic = (mbd != null && mbd.isSynthetic());
            object = getObjectFromFactoryBean(factory, beanName, !synthetic); // 4.2
        }
        return object;
    }

FactoryBeanRegistrySupport中的变量:

/** Cache of singleton objects created by FactoryBeans: FactoryBean name to object. */
    private final Map<String, Object> factoryBeanObjectCache = new ConcurrentHashMap<>(16);   // 用来存储该工厂bean创建的对象

4.1 FactoryBeanRegistrySupport 中的方法,  先尝试从缓存中获取

    protected Object getCachedObjectForFactoryBean(String beanName) {
        return this.factoryBeanObjectCache.get(beanName);
    }

4.2  FactoryBeanRegistrySupport 中的方法,    通过工厂bean,来创建bean

  protected Object getObjectFromFactoryBean(FactoryBean<?> factory, String beanName, boolean shouldPostProcess) {
// 如果工厂bean是单例,并且在一级缓存中已经含有已经创建的 beanName对应的bean , 说明 beanName对应的bean已经被创建出来了,下面为什么还要创建??<<<<<
if (factory.isSingleton() && containsSingleton(beanName)) { synchronized (getSingletonMutex()) {
// 从缓存中获取 与4.1一样 Object object
= this.factoryBeanObjectCache.get(beanName); if (object == null) { object = doGetObjectFromFactoryBean(factory, beanName); // 4.2.1 // Only post-process and store if not put there already during getObject() call above // (e.g. because of circular reference processing triggered by custom getBean calls) Object alreadyThere = this.factoryBeanObjectCache.get(beanName); if (alreadyThere != null) { object = alreadyThere; } else { if (shouldPostProcess) { if (isSingletonCurrentlyInCreation(beanName)) { // Temporarily return non-post-processed object, not storing it yet.. return object; } beforeSingletonCreation(beanName); try { object = postProcessObjectFromFactoryBean(object, beanName); } catch (Throwable ex) { throw new BeanCreationException(beanName, "Post-processing of FactoryBean's singleton object failed", ex); } finally { afterSingletonCreation(beanName); } } if (containsSingleton(beanName)) { this.factoryBeanObjectCache.put(beanName, object); } } } return object; } } else { Object object = doGetObjectFromFactoryBean(factory, beanName); //4.2.1 if (shouldPostProcess) { try { object = postProcessObjectFromFactoryBean(object, beanName); } catch (Throwable ex) { throw new BeanCreationException(beanName, "Post-processing of FactoryBean's object failed", ex); } } return object; } }

4.2.1   FactoryBeanRegistrySupport 中的方法

  private Object doGetObjectFromFactoryBean(FactoryBean<?> factory, String beanName) throws BeanCreationException {
        Object object;
        try {
            if (System.getSecurityManager() != null) {
                AccessControlContext acc = getAccessControlContext();
                try {
                    object = AccessController.doPrivileged((PrivilegedExceptionAction<Object>) factory::getObject, acc);
                }
                catch (PrivilegedActionException pae) {
                    throw pae.getException();
                }
            }
            else {
                object = factory.getObject();   // 应该就是这里创建的 工厂bean 里面的 bean,  <<<<<  待继续看 !!!!
            }
        }
        catch (FactoryBeanNotInitializedException ex) {
            throw new BeanCurrentlyInCreationException(beanName, ex.toString());
        }
        catch (Throwable ex) {
            throw new BeanCreationException(beanName, "FactoryBean threw exception on object creation", ex);
        }

        // Do not accept a null value for a FactoryBean that's not fully
        // initialized yet: Many FactoryBeans just return null then.
        if (object == null) {
            if (isSingletonCurrentlyInCreation(beanName)) {
                throw new BeanCurrentlyInCreationException(
                        beanName, "FactoryBean which is currently in creation returned null from getObject");
            }
            object = new NullBean();
        }
        return object;
    }

 5  AbstractBeanFactory 中有一个 set 集合,专门用来存储 

/** Names of beans that have already been created at least once. */
    private final Set<String> alreadyCreated = Collections.newSetFromMap(new ConcurrentHashMap<>(256));

 

    /**
     * Mark the specified bean as already created (or about to be created).
     * <p>This allows the bean factory to optimize its caching for repeated
     * creation of the specified bean.
     * @param beanName the name of the bean
     */
    protected void markBeanAsCreated(String beanName) {
// 如果 set集合中没有这个 beanName
if (!this.alreadyCreated.contains(beanName)) { synchronized (this.mergedBeanDefinitions) {
// 又检测了一次 DCL ?
if (!this.alreadyCreated.contains(beanName)) { // Let the bean definition get re-merged now that we're actually creating // the bean... just in case some of its metadata changed in the meantime. clearMergedBeanDefinition(beanName); // 5.1
// 添加到 集合中
this.alreadyCreated.add(beanName); } } } }

 

  protected void clearMergedBeanDefinition(String beanName) {
        RootBeanDefinition bd = this.mergedBeanDefinitions.get(beanName);
        if (bd != null) {
            bd.stale = true;   // 设置 RootBeanDefinition的stale属性为true,  这个属性有什么作用呢? 之前看到过,在前面有用到。
        }
    }

stale属性在这里用到了

    protected RootBeanDefinition getMergedLocalBeanDefinition(String beanName) throws BeansException {
        // Quick check on the concurrent map first, with minimal locking.
        RootBeanDefinition mbd = this.mergedBeanDefinitions.get(beanName);
        if (mbd != null && !mbd.stale) {  // 如果stale 为false,mbd为空,那么直接返回缓存中的结果; 设置了stale为false后,就需要重新获取RootBeanDefinition
            return mbd;
        }
        return getMergedBeanDefinition(beanName, getBeanDefinition(beanName));
    }

 

 

 

  

参考文档:

  https://blog.csdn.net/v123411739/article/details/87907784

  https://blog.csdn.net/v123411739/article/details/87954818

 

posted @ 2020-12-01 21:47  你眼里的星辰  阅读(76)  评论(0)    收藏  举报