spring bean 的实例化的过程在容器刷新的 finishBeanFactoryInitialization 办法中(除了懒加载的 bean)。跟进这个办法:

protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {   // 实例化 conversionService 这个 Bean. 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));   }   // 实例化 实现了 LoadTimeWeaverAware 接口的 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. beanFactory.freezeConfiguration();   // 实例化非懒加载的残余的 bean. beanFactory.preInstantiateSingletons();}

持续跟进 preInstantiateSingletons 办法:

    @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);        // 遍历初始化所有非懒加载单例Bean        for (String beanName : beanNames) {            // Bean定义公共的抽象类是AbstractBeanDefinition,一般的Bean在Spring加载Bean定义的时候,实例化进去的是GenericBeanDefinition             // 而Spring上下文包含实例化所有Bean用的AbstractBeanDefinition是RootBeanDefinition // 这时候就应用getMergedLocalBeanDefinition办法做了一次转化,将非RootBeanDefinition转换为RootBeanDefinition以供后续操作。             // 留神如果以后BeanDefinition存在父BeanDefinition,会基于父BeanDefinition生成一个RootBeanDefinition,而后再将调用OverrideFrom子BeanDefinition的相干属性覆写进去。            RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);            if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {                if (isFactoryBean(beanName)) {                    Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);                    if (bean instanceof FactoryBean) {                        final FactoryBean<?> factory = (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办法中                    getBean(beanName);                }            }        }        // Trigger post-initialization callback for all applicable beans...        for (String beanName : beanNames) {            Object singletonInstance = getSingleton(beanName);            if (singletonInstance instanceof SmartInitializingSingleton) {                final SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;                if (System.getSecurityManager() != null) {                    AccessController.doPrivileged((PrivilegedAction<Object>) () -> {                        smartSingleton.afterSingletonsInstantiated();                        return null;                    }, getAccessControlContext());                }                else {                    smartSingleton.afterSingletonsInstantiated();                }            }        }    }

持续跟进 getBean 办法调用了 doGetBean 进入:

    protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType,            @Nullable final Object[] args, boolean typeCheckOnly) throws BeansException {        final String beanName = transformedBeanName(name);        Object bean;        // Eagerly check singleton cache for manually registered singletons.        Object sharedInstance = getSingleton(beanName);        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的状况,须要调用重写的getObject()办法来获取理论的Bean实例            bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);        }        else {            // 缓存中没有找到实例,这里开始创立实例            if (isPrototypeCurrentlyInCreation(beanName)) {                throw new BeanCurrentlyInCreationException(beanName);            }            // 查看 definition 是否曾经存在于 factory 中.            BeanFactory parentBeanFactory = getParentBeanFactory();            if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {                // Not found -> check parent.                String nameToLookup = originalBeanName(name);                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);                }            }            //标记这个 bean 曾经被创立            if (!typeCheckOnly) {                markBeanAsCreated(beanName);            }            try {                final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);                checkMergedBeanDefinition(mbd, beanName, args);                // 确认以后 bean 所以来的 bean 曾经被初始化,如果还没有初始化的话,调用getBean办法创立之                String[] dependsOn = mbd.getDependsOn();                if (dependsOn != null) {                    for (String dep : dependsOn) {                        if (isDependent(beanName, dep)) {                            throw new BeanCreationException(mbd.getResourceDescription(), beanName,                                    "Circular depends-on relationship between '" + beanName + "' and '" + dep + "'");                        }                        registerDependentBean(dep, beanName);                        try {                            getBean(dep);                        }                        catch (NoSuchBeanDefinitionException ex) {                            throw new BeanCreationException(mbd.getResourceDescription(), beanName,                                    "'" + beanName + "' depends on missing bean '" + dep + "'", ex);                        }                    }                }                // 创立 bean 的实例,getSingleton 办法中调用了 ObjectFactory函数式接口中的办法,会调用这里的 createBean 办法去创立实例                if (mbd.isSingleton()) {                    sharedInstance = getSingleton(beanName, () -> {                        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();                    final 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;    }

@Override
protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)

  throws BeanCreationException {

if (logger.isTraceEnabled()) {

  logger.trace("Creating instance of bean '" + beanName + "'");

}
RootBeanDefinition mbdToUse = mbd;
// Make sure bean class is actually resolved at this point, and
// clone the bean definition in case of a dynamically resolved Class // which cannot be stored in the shared merged bean definition. Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {

  mbdToUse = new RootBeanDefinition(mbd);  mbdToUse.setBeanClass(resolvedClass);

}
// Prepare method overrides.
try {

  mbdToUse.prepareMethodOverrides();

}
catch (BeanDefinitionValidationException ex) {

  throw new BeanDefinitionStoreException(mbdToUse.getResourceDescription(),        beanName, "Validation of method overrides failed", ex);

}
try {

  // 如果是代理类的话间接返回代理类,不必实例化.

Object bean = resolveBeforeInstantiation(beanName, mbdToUse);

  if (bean != null) {     return bean;  }

}
catch (Throwable ex) {

  throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName,        "BeanPostProcessor before instantiation of bean failed", ex);

}
try {

  Object beanInstance = doCreateBean(beanName, mbdToUse, args);  if (logger.isTraceEnabled()) {     logger.trace("Finished creating instance of bean '" + beanName + "'");  }  return beanInstance;

}
catch (BeanCreationException | ImplicitlyAppearedSingletonException ex) {

  // A previously detected exception with proper bean creation context already,

// or illegal singleton state to be communicated up to DefaultSingletonBeanRegistry. throw ex;
}
catch (Throwable ex) {

  throw new BeanCreationException(        mbdToUse.getResourceDescription(), beanName, "Unexpected exception during bean creation", ex);

}
}

咱们持续跟进外围办法 doCreateBean:

    protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)            throws BeanCreationException {        BeanWrapper instanceWrapper = null;        if (mbd.isSingleton()) {            // 从缓存中删除            instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);        }        if (instanceWrapper == null) {            // 通过反射调用 bean 的结构器创立一个空的 bean 并用 warp 包装起来            instanceWrapper = createBeanInstance(beanName, mbd, args);        }        final Object bean = instanceWrapper.getWrappedInstance();        Class<?> beanType = instanceWrapper.getWrappedClass();        if (beanType != NullBean.class) {            mbd.resolvedTargetType = beanType;        }        // 这里容许实现了 MergedBeanDefinitionPostProcessor接口的 bean 调用 postProcessMergedBeanDefinition 办法.        synchronized (mbd.postProcessingLock) {            if (!mbd.postProcessed) {                try {                    applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);                }                catch (Throwable ex) {                    throw new BeanCreationException(mbd.getResourceDescription(), beanName,                            "Post-processing of merged bean definition failed", ex);                }                mbd.postProcessed = true;            }        }        // Eagerly cache singletons to be able to resolve circular references        // even when triggered by lifecycle interfaces like BeanFactoryAware.        boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&                isSingletonCurrentlyInCreation(beanName));        if (earlySingletonExposure) {            if (logger.isTraceEnabled()) {                logger.trace("Eagerly caching bean '" + beanName +                        "' to allow for resolving potential circular references");            }            addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));        }        // 初始化 bean 的实例.        Object exposedObject = bean;        try {            //这里实现属性填充,依赖的注入也是在这里实现的            populateBean(beanName, mbd, instanceWrapper);            exposedObject = initializeBean(beanName, exposedObject, mbd);        }        catch (Throwable ex) {            if (ex instanceof BeanCreationException && beanName.equals(((BeanCreationException) ex).getBeanName())) {                throw (BeanCreationException) ex;            }            else {                throw new BeanCreationException(                        mbd.getResourceDescription(), beanName, "Initialization of bean failed", ex);            }        }        if (earlySingletonExposure) {            Object earlySingletonReference = getSingleton(beanName, false);            if (earlySingletonReference != null) {                if (exposedObject == bean) {                    exposedObject = earlySingletonReference;                }                else if (!this.allowRawInjectionDespiteWrapping && hasDependentBean(beanName)) {                    String[] dependentBeans = getDependentBeans(beanName);                    Set<String> actualDependentBeans = new LinkedHashSet<>(dependentBeans.length);                    for (String dependentBean : dependentBeans) {                        if (!removeSingletonIfCreatedForTypeCheckOnly(dependentBean)) {                            actualDependentBeans.add(dependentBean);                        }                    }                    if (!actualDependentBeans.isEmpty()) {                        throw new BeanCurrentlyInCreationException(beanName,                                "Bean with name '" + beanName + "' has been injected into other beans [" +                                StringUtils.collectionToCommaDelimitedString(actualDependentBeans) +                                "] in its raw version as part of a circular reference, but has eventually been " +                                "wrapped. This means that said other beans do not use the final version of the " +                                "bean. This is often the result of over-eager type matching - consider using " +                                "'getBeanNamesForType' with the 'allowEagerInit' flag turned off, for example.");                    }                }            }        }        // Register bean as disposable.        try {            registerDisposableBeanIfNecessary(beanName, bean, mbd);        }        catch (BeanDefinitionValidationException ex) {            throw new BeanCreationException(                    mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);        }        return exposedObject;    }

跟进 populateBean 办法:

    protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) {        if (bw == null) {            if (mbd.hasPropertyValues()) {                throw new BeanCreationException(                        mbd.getResourceDescription(), beanName, "Cannot apply property values to null instance");            }            else {                // Skip property population phase for null instance.                return;            }        }        // 给InstantiationAwareBeanPostProcessors最初一次机会在属性注入前批改Bean的属性值         // 具体通过调用postProcessAfterInstantiation办法,如果调用返回false,示意不用持续进行依赖注入,间接返回        if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {            for (BeanPostProcessor bp : getBeanPostProcessors()) {                if (bp instanceof InstantiationAwareBeanPostProcessor) {                    InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;                    if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {                        return;                    }                }            }        }        PropertyValues pvs = (mbd.hasPropertyValues() ? mbd.getPropertyValues() : null);        // 依据Bean配置的依赖注入形式实现注入,默认是0,即不走以下逻辑,所有的依赖注入都须要在xml文件中有显式的配置         // 如果设置了相干的依赖拆卸形式,会遍历Bean中的属性,依据类型或名称来实现相应注入,无需额定配置        int resolvedAutowireMode = mbd.getResolvedAutowireMode();        if (resolvedAutowireMode == AUTOWIRE_BY_NAME || resolvedAutowireMode == AUTOWIRE_BY_TYPE) {            MutablePropertyValues newPvs = new MutablePropertyValues(pvs);            // Add property values based on autowire by name if applicable.            if (resolvedAutowireMode == AUTOWIRE_BY_NAME) {                autowireByName(beanName, mbd, bw, newPvs);            }            // Add property values based on autowire by type if applicable.            if (resolvedAutowireMode == AUTOWIRE_BY_TYPE) {                autowireByType(beanName, mbd, bw, newPvs);            }            pvs = newPvs;        }        boolean hasInstAwareBpps = hasInstantiationAwareBeanPostProcessors();        boolean needsDepCheck = (mbd.getDependencyCheck() != AbstractBeanDefinition.DEPENDENCY_CHECK_NONE);        PropertyDescriptor[] filteredPds = null;        if (hasInstAwareBpps) {            if (pvs == null) {                // new 了一个 MutablePropertyValues 对象                pvs = mbd.getPropertyValues();            }            // 这里获取 所有实现了 InstantiationAwareBeanPostProcessor 接口的 bean 并调用 postProcessProcessProperties 办法,其中有一个 后置处理器 AutowireAnnotationBeanPostProcessor 的 postProcessProperties 办法中对 bean 须要注入的依赖字段通过反射实现注入。            for (BeanPostProcessor bp : getBeanPostProcessors()) {                if (bp instanceof InstantiationAwareBeanPostProcessor) {                    InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;                    PropertyValues pvsToUse = ibp.postProcessProperties(pvs, bw.getWrappedInstance(), beanName);                    if (pvsToUse == null) {                        if (filteredPds == null) {                            filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);                        }                        pvsToUse = ibp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);                        if (pvsToUse == null) {                            return;                        }                    }                    pvs = pvsToUse;                }            }        }        if (needsDepCheck) {            if (filteredPds == null) {                filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);            }            checkDependencies(beanName, mbd, filteredPds, pvs);        }        if (pvs != null) {            // 填充属性            applyPropertyValues(beanName, mbd, bw, pvs);        }    }

跟进 AutowireAnnotationBeanPostProcessor 的 postProcessProperties 办法:

    public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) {        // 从缓存中获取该 bean 须要注入的依赖类型 (这里须要的依赖可能还没有实例化)        InjectionMetadata metadata = findAutowiringMetadata(beanName, bean.getClass(), pvs);        try {            // 这里是实现依赖的注入            metadata.inject(bean, beanName, pvs);        }        catch (BeanCreationException ex) {            throw ex;        }        catch (Throwable ex) {            throw new BeanCreationException(beanName, "Injection of autowired dependencies failed", ex);        }        return pvs;    }

接着跟进 InjectionMetadata 的 inject 办法:

    public void inject(Object target, @Nullable String beanName, @Nullable PropertyValues pvs) throws Throwable {        Collection<InjectedElement> checkedElements = this.checkedElements;        Collection<InjectedElement> elementsToIterate =                (checkedElements != null ? checkedElements : this.injectedElements);        if (!elementsToIterate.isEmpty()) {            for (InjectedElement element : elementsToIterate) {                if (logger.isTraceEnabled()) {                    logger.trace("Processing injected element of bean '" + beanName + "': " + element);                }                // 此处遍历 bean 依赖,每个依赖对应一个 InjectedElement,而后调用inject办法                element.inject(target, beanName, pvs);            }        }    }

跟进 InjectedElement 的 inject 办法:

        protected void inject(Object bean, @Nullable String beanName, @Nullable PropertyValues pvs) throws Throwable {            // 此处的 field 就对应相应 bean 的属性            Field field = (Field) this.member;            Object value;            if (this.cached) {                value = resolvedCachedArgument(beanName, this.cachedFieldValue);            }            else {                DependencyDescriptor desc = new DependencyDescriptor(field, this.required);                desc.setContainingClass(bean.getClass());                Set<String> autowiredBeanNames = new LinkedHashSet<>(1);                Assert.state(beanFactory != null, "No BeanFactory available");                TypeConverter typeConverter = beanFactory.getTypeConverter();                try {                    // 这里的要害办法,获取到须要注入的 bean 的实例                    value = beanFactory.resolveDependency(desc, beanName, autowiredBeanNames, typeConverter);                }                catch (BeansException ex) {                    throw new UnsatisfiedDependencyException(null, beanName, new InjectionPoint(field), ex);                }                synchronized (this) {                    if (!this.cached) {                        if (value != null || this.required) {                            this.cachedFieldValue = desc;                            registerDependentBeans(beanName, autowiredBeanNames);                            if (autowiredBeanNames.size() == 1) {                                String autowiredBeanName = autowiredBeanNames.iterator().next();                                if (beanFactory.containsBean(autowiredBeanName) &&                                        beanFactory.isTypeMatch(autowiredBeanName, field.getType())) {                                    this.cachedFieldValue = new ShortcutDependencyDescriptor(                                            desc, autowiredBeanName, field.getType());                                }                            }                        }                        else {                            this.cachedFieldValue = null;                        }                        this.cached = true;                    }                }            }            if (value != null) {                ReflectionUtils.makeAccessible(field);                field.set(bean, value);            }        }    }

持续跟进 resolveDependency 办法:

    public Object resolveDependency(DependencyDescriptor descriptor, @Nullable String requestingBeanName,            @Nullable Set<String> autowiredBeanNames, @Nullable TypeConverter typeConverter) throws BeansException {        descriptor.initParameterNameDiscovery(getParameterNameDiscoverer());        if (Optional.class == descriptor.getDependencyType()) {            return createOptionalDependency(descriptor, requestingBeanName);        }        else if (ObjectFactory.class == descriptor.getDependencyType() ||                ObjectProvider.class == descriptor.getDependencyType()) {            return new DependencyObjectProvider(descriptor, requestingBeanName);        }        else if (javaxInjectProviderClass == descriptor.getDependencyType()) {            return new Jsr330Factory().createDependencyProvider(descriptor, requestingBeanName);        }        else {            // 这里是查找懒加载的实例,失常的走上面一个办法            Object result = getAutowireCandidateResolver().getLazyResolutionProxyIfNecessary(                    descriptor, requestingBeanName);            if (result == null) {                // 疏忽其余的,间接看这个办法                result = doResolveDependency(descriptor, requestingBeanName, autowiredBeanNames, typeConverter);            }            return result;        }    }

跟进 doResolveDependency 办法:

    public Object doResolveDependency(DependencyDescriptor descriptor, @Nullable String beanName,            @Nullable Set<String> autowiredBeanNames, @Nullable TypeConverter typeConverter) throws BeansException {        InjectionPoint previousInjectionPoint = ConstructorResolver.setCurrentInjectionPoint(descriptor);        try {            // 1. 疾速查找,默认返回了空。            Object shortcut = descriptor.resolveShortcut(this);            if (shortcut != null) {                return shortcut;            }            Class<?> type = descriptor.getDependencyType();            // 2. 注入指定值,QualifierAnnotationAutowireCandidateResolver解析@Value会用到            Object value = getAutowireCandidateResolver().getSuggestedValue(descriptor);            if (value != null) {                if (value instanceof String) {                    String strVal = resolveEmbeddedValue((String) value);                    BeanDefinition bd = (beanName != null && containsBean(beanName) ?                            getMergedBeanDefinition(beanName) : null);                    value = evaluateBeanDefinitionString(strVal, bd);                }                TypeConverter converter = (typeConverter != null ? typeConverter : getTypeConverter());                try {                    return converter.convertIfNecessary(value, type, descriptor.getTypeDescriptor());                }                catch (UnsupportedOperationException ex) {                    // A custom TypeConverter which does not support TypeDescriptor resolution...                    return (descriptor.getField() != null ?                            converter.convertIfNecessary(value, type, descriptor.getField()) :                            converter.convertIfNecessary(value, type, descriptor.getMethodParameter()));                }            }            // 汇合依赖,如 Array、List、Set、Map。外部查找依赖也是应用findAutowireCandidates            Object multipleBeans = resolveMultipleBeans(descriptor, beanName, autowiredBeanNames, typeConverter);            if (multipleBeans != null) {                return multipleBeans;            }            // 单个依赖查问            Map<String, Object> matchingBeans = findAutowireCandidates(beanName, type, descriptor);            if (matchingBeans.isEmpty()) {                if (isRequired(descriptor)) {                    raiseNoMatchingBeanFound(type, descriptor.getResolvableType(), descriptor);                }                return null;            }            String autowiredBeanName;            Object instanceCandidate;            if (matchingBeans.size() > 1) {                autowiredBeanName = determineAutowireCandidate(matchingBeans, descriptor);                if (autowiredBeanName == null) {                    if (isRequired(descriptor) || !indicatesMultipleBeans(type)) {                        return descriptor.resolveNotUnique(descriptor.getResolvableType(), matchingBeans);                    }                    else {                        // In case of an optional Collection/Map, silently ignore a non-unique case:                        // possibly it was meant to be an empty collection of multiple regular beans                        // (before 4.3 in particular when we didn't even look for collection beans).                        return null;                    }                }                instanceCandidate = matchingBeans.get(autowiredBeanName);            }            else {                // 走到这里阐明正确得匹配到了正确的一个.                Map.Entry<String, Object> entry = matchingBeans.entrySet().iterator().next();                autowiredBeanName = entry.getKey();                instanceCandidate = entry.getValue();            }            if (autowiredBeanNames != null) {                autowiredBeanNames.add(autowiredBeanName);            }            if (instanceCandidate instanceof Class) {                // 之前存的是 Class 实例,必定走这里,这里会再一次调用 beanFactory 的 getBean() 办法,如果存在循环以来的话,这里被依赖的 bean 曾经被创立并搁置在 singtonFactory 中。                instanceCandidate = descriptor.resolveCandidate(autowiredBeanName, type, this);            }            Object result = instanceCandidate;            if (result instanceof NullBean) {                if (isRequired(descriptor)) {                    raiseNoMatchingBeanFound(type, descriptor.getResolvableType(), descriptor);                }                result = null;            }            if (!ClassUtils.isAssignableValue(type, result)) {                throw new BeanNotOfRequiredTypeException(autowiredBeanName, type, instanceCandidate.getClass());            }            return result;        }        finally {            ConstructorResolver.setCurrentInjectionPoint(previousInjectionPoint);        }    }

咱们跟进 findAutowireCandidates 办法:

    protected Map<String, Object> findAutowireCandidates(            @Nullable String beanName, Class<?> requiredType, DependencyDescriptor descriptor) {        String[] candidateNames = BeanFactoryUtils.beanNamesForTypeIncludingAncestors(                this, requiredType, true, descriptor.isEager());        Map<String, Object> result = new LinkedHashMap<>(candidateNames.length);        for (Map.Entry<Class<?>, Object> classObjectEntry : this.resolvableDependencies.entrySet()) {            Class<?> autowiringType = classObjectEntry.getKey();            if (autowiringType.isAssignableFrom(requiredType)) {                Object autowiringValue = classObjectEntry.getValue();                autowiringValue = AutowireUtils.resolveAutowiringValue(autowiringValue, requiredType);                if (requiredType.isInstance(autowiringValue)) {                    result.put(ObjectUtils.identityToString(autowiringValue), autowiringValue);                    break;                }            }        }        for (String candidate : candidateNames) {            // 这里的isSelfReference 阐明 beanName 和依赖是同一个 bean。isAutowireCandidate进一步匹配bd.autowireCandidate、泛型、@@Qualifier等进行过滤。            if (!isSelfReference(beanName, candidate) && isAutowireCandidate(candidate, descriptor)) {                // 此处把候选对象缓存了起来(key -> beanName,value -> Class 对象)                addCandidateEntry(result, candidate, descriptor, requiredType);            }        }        if (result.isEmpty()) {            boolean multiple = indicatesMultipleBeans(requiredType);            // Consider fallback matches if the first pass failed to find anything...            DependencyDescriptor fallbackDescriptor = descriptor.forFallbackMatch();            for (String candidate : candidateNames) {                if (!isSelfReference(beanName, candidate) && isAutowireCandidate(candidate, fallbackDescriptor) &&                        (!multiple || getAutowireCandidateResolver().hasQualifier(descriptor))) {                    addCandidateEntry(result, candidate, descriptor, requiredType);                }            }            if (result.isEmpty() && !multiple) {                // Consider self references as a final pass...                // but in the case of a dependency collection, not the very same bean itself.                for (String candidate : candidateNames) {                    if (isSelfReference(beanName, candidate) &&                            (!(descriptor instanceof MultiElementDescriptor) || !beanName.equals(candidate)) &&                            isAutowireCandidate(candidate, fallbackDescriptor)) {                        addCandidateEntry(result, candidate, descriptor, requiredType);                    }                }            }        }        return result;    }
走完 populateBean (属性注入之后)下一步就是初始化操作,进入到 initializeBean 办法:
    protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {        if (System.getSecurityManager() != null) {            AccessController.doPrivileged((PrivilegedAction<Object>) () -> {                // 实现了 Aware 接口及其子接口的类,调用对应的办法                invokeAwareMethods(beanName, bean);                return null;            }, getAccessControlContext());        }        else {            invokeAwareMethods(beanName, bean);        }        Object wrappedBean = bean;        if (mbd == null || !mbd.isSynthetic()) {            wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);        }        try {            invokeInitMethods(beanName, wrappedBean, mbd);        }        catch (Throwable ex) {            throw new BeanCreationException(                    (mbd != null ? mbd.getResourceDescription() : null),                    beanName, "Invocation of init method failed", ex);        }        if (mbd == null || !mbd.isSynthetic()) {            wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);        }        return wrappedBean;    }