code前行

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

方法分析(3)

org.springframework.beans.factory.support.AbstractBeanFactory.markBeanAsCreated(String)

    protected void markBeanAsCreated(String beanName) {
        if (!this.alreadyCreated.contains(beanName)) {//private final Set<String> alreadyCreated = Collections.newSetFromMap(new ConcurrentHashMap<String, Boolean>(256));
synchronized (this.mergedBeanDefinitions) {
//这里在同步块内再做一次判断,双重判断
if (!this.alreadyCreated.contains(beanName)) { //初始化的时候第一次进入肯定是没有 clearMergedBeanDefinition(beanName);//代码(1) this.alreadyCreated.add(beanName);//然后在 alreadyCreated 这个 ConcurrentHashMap 中放入这个 beanName } } } }
    
//代码(1)
//private final Map<String, RootBeanDefinition> mergedBeanDefinitions = new ConcurrentHashMap<String, RootBeanDefinition>(256);
protected void clearMergedBeanDefinition(String beanName) { this.mergedBeanDefinitions.remove(beanName); }

 

方法分析(4)
org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(String)
private final Map<String, RootBeanDefinition> mergedBeanDefinitions = new ConcurrentHashMap<String, RootBeanDefinition>(256);
    protected RootBeanDefinition getMergedLocalBeanDefinition(String beanName) throws BeansException {
        //初始化第一次创建bean mergedBeanDefinitions 中不包含该bean 
        RootBeanDefinition mbd = this.mergedBeanDefinitions.get(beanName);
        if (mbd != null) {
            return mbd;
        }
        return getMergedBeanDefinition(beanName, getBeanDefinition(beanName));
    }

1、-----org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(String)

    public BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException {
        BeanDefinition bd = this.beanDefinitionMap.get(beanName);//在初始化时 obtainFreshBeanFactory 方法被赋值
        if (bd == null) {
            if (this.logger.isTraceEnabled()) {
                this.logger.trace("No bean named '" + beanName + "' found in " + this);
            }
            throw new NoSuchBeanDefinitionException(beanName);
        }
        return bd;
    }
2、---org.springframework.beans.factory.support.AbstractBeanFactory.getMergedBeanDefinition(String, BeanDefinition)
    protected RootBeanDefinition getMergedBeanDefinition(String beanName, BeanDefinition bd)
            throws BeanDefinitionStoreException {

        return getMergedBeanDefinition(beanName, bd, null);
    }

3、--org.springframework.beans.factory.support.AbstractBeanFactory.getMergedBeanDefinition(String, BeanDefinition, BeanDefinition)

    protected RootBeanDefinition getMergedBeanDefinition( String beanName, BeanDefinition bd, BeanDefinition containingBd) throws BeanDefinitionStoreException {

        synchronized (this.mergedBeanDefinitions) {
            RootBeanDefinition mbd = null;

            // Check with full lock now in order to enforce the same merged instance.
            if (containingBd == null) {
                mbd = this.mergedBeanDefinitions.get(beanName);
            }

            if (mbd == null) {
                if (bd.getParentName() == null) {
                    // Use copy of given root bean definition.
                    if (bd instanceof RootBeanDefinition) {
                        mbd = ((RootBeanDefinition) bd).cloneBeanDefinition();
                    }
                    else {
                        mbd = new RootBeanDefinition(bd);
                    }
                }
                else {
                    // Child bean definition: needs to be merged with parent.
                    BeanDefinition pbd;
                    try {
                        String parentBeanName = transformedBeanName(bd.getParentName());
                        if (!beanName.equals(parentBeanName)) {
                            pbd = getMergedBeanDefinition(parentBeanName);
                        }
                        else {
                            BeanFactory parent = getParentBeanFactory();
                            if (parent instanceof ConfigurableBeanFactory) {
                                pbd = ((ConfigurableBeanFactory) parent).getMergedBeanDefinition(parentBeanName);
                            }
                            else {
                                throw new NoSuchBeanDefinitionException(parentBeanName,
                                        "Parent name '" + parentBeanName + "' is equal to bean name '" + beanName +
                                        "': cannot be resolved without an AbstractBeanFactory parent");
                            }
                        }
                    }
                    catch (NoSuchBeanDefinitionException ex) {
                        throw new BeanDefinitionStoreException(bd.getResourceDescription(), beanName,
                                "Could not resolve parent bean definition '" + bd.getParentName() + "'", ex);
                    }
                    // Deep copy with overridden values.
                    mbd = new RootBeanDefinition(pbd);
                    mbd.overrideFrom(bd);
                }

                // 如果为空则设为单例
                if (!StringUtils.hasLength(mbd.getScope())) {
                    mbd.setScope(RootBeanDefinition.SCOPE_SINGLETON);
                }

                //这里意思是一个不是单例的bean,其中也不能包含单例 bean,在这里检查并修正
                if (containingBd != null && !containingBd.isSingleton() && mbd.isSingleton()) {
                    mbd.setScope(containingBd.getScope());
                }

                //当接下来要创建这个 bean ,或者已经创建过一次了,beanDefinition 就放入缓存中
                if (containingBd == null && isCacheBeanMetadata()) {
                    this.mergedBeanDefinitions.put(beanName, mbd);//放入缓存
                }
            }
            return mbd;
        }
    }

 

 
posted on 2019-05-26 13:24  code前行  阅读(385)  评论(0编辑  收藏  举报