精彩的内容来了,各位看官,持续~

接上一节,AbstractApplicationContext 类中的refresh()办法,有那么一行不起眼的代码:

// Instantiate all remaining (non-lazy-init) singletons.finishBeanFactoryInitialization(beanFactory);

就是它,创立bean最集中的中央,实例化所有非懒加载的单例。

点击这个办法进去,能够看到办法体内又有一行代码:

// Instantiate all remaining (non-lazy-init) singletons.beanFactory.preInstantiateSingletons();

真正干活的爷们就是它了。再点进去,能够看到办法实现:

  1. getMergedLocalBeanDefinition(beanName) ,将BeanDefinition的定义进行合并
  2. if (isFactoryBean(beanName)) {……} ,判断是不是FactoryBean,拿到FactoryBean的实例,判断是否须要提前实例化,须要则通过getBean来实例化
  3. getBean(beanName) 一般bean的实例化,点进去,来到doGetBean(),上码:

    protected <T> T doGetBean(    String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly)throws BeansException {    // 获取实在的beanName,因为有的bean有别名,FactoryBean自身创立的时候,传的是&BeanName    String beanName = transformedBeanName(name);    Object beanInstance;    // 从缓存获取单例实例,解决循环依赖和反复创立    Object sharedInstance = getSingleton(beanName);    if (sharedInstance != null && args == null) {        if (logger.isTraceEnabled()) {            if (isSingletonCurrentlyInCreation(beanName)) {                logger.trace("……");            }            else {                logger.trace("……");            }        }        //解决相似FactoryBean这样非凡的bean解决        beanInstance = getObjectForBeanInstance(sharedInstance, name, beanName, null);    }    else {        // 原型模式不需解决循环依赖,因为原型bean不放缓存,不会提前裸露援用        if (isPrototypeCurrentlyInCreation(beanName)) {            throw new BeanCurrentlyInCreationException(beanName);        }        // 如果 beanDefinitionMap未加载有该bean,则从parentBeanFactory查找        BeanFactory parentBeanFactory = getParentBeanFactory();        if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {            String nameToLookup = originalBeanName(name);            if (parentBeanFactory instanceof AbstractBeanFactory) {                return ((AbstractBeanFactory) parentBeanFactory).doGetBean(                        nameToLookup, requiredType, args, typeCheckOnly);            }            else if (args != null) {                return (T) parentBeanFactory.getBean(nameToLookup, args);            }            else if (requiredType != null) {                return parentBeanFactory.getBean(nameToLookup, requiredType);            }            else {                return (T) parentBeanFactory.getBean(nameToLookup);            }        }        // 非类型查看的时候,才标记该bean已创立        if (!typeCheckOnly) {            markBeanAsCreated(beanName);        }        StartupStep beanCreation = this.applicationStartup.start("spring.beans.instantiate")                .tag("beanName", name);        try {            if (requiredType != null) {                beanCreation.tag("beanType", requiredType::toString);            }            RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);            checkMergedBeanDefinition(mbd, beanName, args);            // 以后bean依赖的bean的创立。            String[] dependsOn = mbd.getDependsOn();            if (dependsOn != null) {                for (String dep : dependsOn) {                    // 不可显式依赖(@DependOn)                    if (isDependent(beanName, dep)) {                        throw new BeanCreationException("……");                    }                    // 先创立依赖的bean,再创立自身本人                    registerDependentBean(dep, beanName);                    try {                        getBean(dep);                    }                    catch (NoSuchBeanDefinitionException ex) {                        throw new BeanCreationException("……");                    }                }            }            // 单例bean创立            if (mbd.isSingleton()) {                sharedInstance = getSingleton(beanName, () -> {                    try {                        return createBean(beanName, mbd, args);                    }                    catch (BeansException ex) {                        destroySingleton(beanName);                        throw ex;                    }                });                beanInstance = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);            }            // 原型bean创立            else if (mbd.isPrototype()) {                Object prototypeInstance = null;                try {                    beforePrototypeCreation(beanName);                    prototypeInstance = createBean(beanName, mbd, args);                }                finally {                    afterPrototypeCreation(beanName);                }                beanInstance = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);            }            // 指定scope上实例化bean            else {                String scopeName = mbd.getScope();                if (!StringUtils.hasLength(scopeName)) {                    throw new IllegalStateException("……");                }                Scope scope = this.scopes.get(scopeName);                if (scope == null) {                    throw new IllegalStateException("……");                }                try {                    Object scopedInstance = scope.get(beanName, () -> {                        beforePrototypeCreation(beanName);                        try {                            return createBean(beanName, mbd, args);                        }                        finally {                            afterPrototypeCreation(beanName);                        }                    });                    beanInstance = getObjectForBeanInstance(scopedInstance, name, beanName, mbd);                }                catch (IllegalStateException ex) {                    throw new ScopeNotActiveException(beanName, scopeName, ex);                }            }        }        catch (BeansException ex) {            beanCreation.tag("exception", ex.getClass().toString());            beanCreation.tag("message", String.valueOf(ex.getMessage()));            cleanupAfterBeanCreationFailure(beanName);            throw ex;        }        finally {            beanCreation.end();        }    }    // 查看理论类型与所需类型是否合乎,不合乎则装换    return adaptBeanInstance(name, beanInstance, requiredType);}

    以上代码中,创立bean的中央是:

    createBean(beanName, mbd, args);

    点击该办法进去,还藏有一层:

    doCreateBean(beanName, mbdToUse, args);

    点击该办法进去,就是真正创立bean的中央。下节再讲,喝口酒先~~