• Spring IoC源码解析之getBean


    一、实例化所有的非懒加载的单实例Bean

      从org.springframework.context.support.AbstractApplicationContext#refresh方法开发,进入到实例化所有的非懒加载的单实例Bean的finishBeanFactoryInitialization(beanFactory)的方法:

    protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
            // 为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(new StringValueResolver() {
                    @Override
                    public String resolveStringValue(String strVal) {
                        return getEnvironment().resolvePlaceholders(strVal);
                    }
                });
            }
    
            // Initialize LoadTimeWeaverAware beans early to allow for registering their transformers early.
            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);
    
            //冻结所有的Bean定义 , 至此注册的Bean定义将不被修改或任何进一步的处理
            beanFactory.freezeConfiguration();
    
            //实例化剩下的单实例Bean
            beanFactory.preInstantiateSingletons();
        }

      进入实例化剩下的单实例Bean的beanFactory.preInstantiateSingletons()的方法:

    public void preInstantiateSingletons() throws BeansException {
            if (logger.isDebugEnabled()) {
                logger.debug("Pre-instantiating singletons in " + this);
            }
    
            //获取我们容器中所有Bean定义的名称
            List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);
    
            //循环我们所有的bean定义名称
            for (String beanName : beanNames) {
                //合并我们的bean定义
                RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
                //根据bean定义判断是不是抽象的 && 不是单例的 && 不是懒加载的
                if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
                    //是否FactoryBean
                    if (isFactoryBean(beanName)) {
                        //是 给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());
                            }
                            //调用真正的getBean
                            if (isEagerInit) {
                                getBean(beanName);
                            }
                        }
                    }
                    else {//非工厂Bean就是普通的bean
                        getBean(beanName);
                    }
                }
            }
    
            //获取所有的bean的名称 至此所有的单实例的bean已经加入到单实例Bean的缓存池中,所谓的单实例缓存池实际上就是一个ConcurrentHashMap
            for (String beanName : beanNames) {
                //从单例缓存池中获取所有的对象
                Object singletonInstance = getSingleton(beanName);
                //判断当前的bean是否实现了SmartInitializingSingleton接口
                if (singletonInstance instanceof SmartInitializingSingleton) {
                    final SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;
                    if (System.getSecurityManager() != null) {
                        AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
                            smartSingleton.afterSingletonsInstantiated();
                            return null;
                        }, getAccessControlContext());
                    }
                    else {
                        //触发实例化之后的方法afterSingletonsInstantiated
                        smartSingleton.afterSingletonsInstantiated();
                    }
                }
            }
        }

      前面多个地方涉及到getBean,接下来就分析下getBean(很重要

    二、getBean流程

      进入getBean(beanName)的方法:

    @Override
        public Object getBean(String name) throws BeansException {
            //真正的获取Bean的逻辑
            return doGetBean(name, null, null, false);
        }

      该方法啥没干,又交给了干活的doGetBean(name, null, null, false)方法:

    protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType,
                @Nullable final Object[] args, boolean typeCheckOnly) throws BeansException {
    
            //在这里传入进来的name可能是别名、也有可能是工厂beanName,所以在这里需要转换
            final String beanName = transformedBeanName(name);
            Object bean;
    
            //先尝试去缓存中获取对象
            Object sharedInstance = getSingleton(beanName);
    
            if (sharedInstance != null && args == null) {
                if (logger.isDebugEnabled()) {
                    if (isSingletonCurrentlyInCreation(beanName)) {
                        logger.debug("Returning eagerly cached instance of singleton bean '" + beanName +
                                "' that is not fully initialized yet - a consequence of a circular reference");
                    }
                    else {
                        logger.debug("Returning cached instance of singleton bean '" + beanName + "'");
                    }
                }
                /**
                 * 如果sharedInstance是普通的单例bean,下面的方法会直接返回。但如果
                 * sharedInstance是FactoryBean类型的,则需调用getObject工厂方法获取真正的
                 * bean实例。如果用户想获取 FactoryBean 本身,这里也不会做特别的处理,直接返回
                 * 即可。毕竟 FactoryBean 的实现类本身也是一种 bean,只不过具有一点特殊的功能而已。
                 */
                bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
            }
    
            else {
    
                //Spring只能解决单例对象的setter注入的循环依赖,不能解决构造器注入,也不能解决多实例的循环依赖
                if (isPrototypeCurrentlyInCreation(beanName)) {
                    throw new BeanCurrentlyInCreationException(beanName);
                }
    
                //判断是否有父工厂
                BeanFactory parentBeanFactory = getParentBeanFactory();
                //若存在父工厂,切当前的bean工厂不存在当前的bean定义,那么bean定义是存在于父beanFactory中
                if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {
                    //获取bean的原始名称
                    String nameToLookup = originalBeanName(name);
                    //若为AbstractBeanFactory类型,委托父类处理
                    if (parentBeanFactory instanceof AbstractBeanFactory) {
                        return ((AbstractBeanFactory) parentBeanFactory).doGetBean(
                                nameToLookup, requiredType, args, typeCheckOnly);
                    }
                    else if (args != null) {
                        // 委托给构造函数getBean()处理
                        return (T) parentBeanFactory.getBean(nameToLookup, args);
                    }
                    else {
                        // 没有args,委托给标准的getBean()处理
                        return parentBeanFactory.getBean(nameToLookup, requiredType);
                    }
                }
    
                /**
                 * 方法参数typeCheckOnly ,是用来判断调用getBean(...) 方法时,表示是否为仅仅进行类型检查获取Bean对象
                 * 如果不是仅仅做类型检查,而是创建Bean对象,则需要调用markBeanAsCreated(String beanName) 方法,进行记录
                 */
                if (!typeCheckOnly) {
                    markBeanAsCreated(beanName);
                }
    
                try {
                    //从容器中获取beanName相应的GenericBeanDefinition对象,并将其转换为RootBeanDefinition对象
                    final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
                    //检查当前创建的bean定义是不是抽象的bean定义
                    checkMergedBeanDefinition(mbd, beanName, args);
    
                    //处理dependsOn的依赖(这个不是我们所谓的循环依赖 而是bean创建前后的依赖)
                    //依赖bean的名称
                    String[] dependsOn = mbd.getDependsOn();
                    if (dependsOn != null) {
                        for (String dep : dependsOn) {
                            //beanName是当前正在创建的bean,dep是正在创建的bean的依赖的bean的名称
                            if (isDependent(beanName, dep)) {
                                throw new BeanCreationException(mbd.getResourceDescription(), beanName,
                                        "Circular depends-on relationship between '" + beanName + "' and '" + dep + "'");
                            }
                            //保存的是依赖beanName之间的映射关系:依赖beanName -> beanName的集合
                            registerDependentBean(dep, beanName);
                            try {
                                //获取dependsOn的bean
                                getBean(dep);
                            }
                            catch (NoSuchBeanDefinitionException ex) {
                                throw new BeanCreationException(mbd.getResourceDescription(), beanName,
                                        "'" + beanName + "' depends on missing bean '" + dep + "'", ex);
                            }
                        }
                    }
    
                    //是单例则创建单例Bean
                    if (mbd.isSingleton()) {
                        //把beanName和一个singletonFactory匿名内部类传入用于回调
                        sharedInstance = getSingleton(beanName, () -> {
                            try {
                                //创建bean的逻辑
                                return createBean(beanName, mbd, args);
                            }
                            catch (BeansException ex) {
                                //创建bean的过程中发生异常,需要销毁关于当前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.isDebugEnabled()) {
                        logger.debug("Failed to convert bean '" + name + "' to required type '" +
                                ClassUtils.getQualifiedName(requiredType) + "'", ex);
                    }
                    throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());
                }
            }
            return (T) bean;
        }

      第一步:先尝试去缓存中获取对象

      Object sharedInstance = getSingleton(beanName),由于第一次肯定为空:

    public Object getSingleton(String beanName) {
            //在这里系统一般是允许早期对象引用的allowEarlyReference通过这个参数可以控制解决循环依赖
            return getSingleton(beanName, true);
        }

      进入到getSingleton(beanName, true)方法,这里涉及到Spring的三级缓存,用它来解决循环依赖:

    protected Object getSingleton(String beanName, boolean allowEarlyReference) {
            /**
             * 第一步:我们尝试去一级缓存(单例缓存池中去获取对象,一般情况从该map中获取的对象是直接可以使用的)
             * Spring IoC容器初始化加载单实例bean的时候第一次进来的时候 该map中一般返回空
             */
            Object singletonObject = this.singletonObjects.get(beanName);
            /**
             * 若在第一级缓存中没有获取到对象,并且singletonsCurrentlyInCreation正在创建的单实例的list包含该beanName
             * Spring IoC容器初始化加载单实例bean的时候第一次进来的时候 该list中一般返回空,但是循环依赖的时候可以满足该条件
             */
            if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
                synchronized (this.singletonObjects) {
                    /**
                     * 尝试去二级缓存中获取对象(二级缓存中的对象是一个早期对象)
                     * 何为早期对象:就是bean刚刚调用了构造方法,还没给bean的属性进行赋值的对象就是早期对象
                     */
                    singletonObject = this.earlySingletonObjects.get(beanName);
                    /**
                     * 二级缓存中也没有获取到对象,allowEarlyReference为true(参数是有上一个方法传递进来的true)
                     */
                    if (singletonObject == null && allowEarlyReference) {
                        /**
                         * 直接从三级缓存中获取ObjectFactory对象 这个对接就是用来解决循环依赖的关键所在
                         * 在getBean的过程中,当bean调用了构造方法的时候,把早期对象包裹成一个ObjectFactory暴露到三级缓存中
                         */
                        ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
                        //从三级缓存中获取到对象不为空
                        if (singletonFactory != null) {
                            /**
                             * 在这里通过暴露的ObjectFactory包装对象中,通过调用他的getObject()来获取我们的早期对象
                             * 在这个环节中会调用到 getEarlyBeanReference()来进行后置处理
                             */
                            singletonObject = singletonFactory.getObject();
                            //把早期对象放置在二级缓存,
                            this.earlySingletonObjects.put(beanName, singletonObject);
                            //ObjectFactory 包装对象从三级缓存中删除掉
                            this.singletonFactories.remove(beanName);
                        }
                    }
                }
            }
            return singletonObject;
        }

      第二步:走else逻辑

      Spring只能解决单例对象的setter注入的循环依赖,不能解决构造器注入,也不能解决多实例的循环依赖,所以会抛Bean当前正在创建的异常,接着判断是否有父工厂,有就调用父工厂的getBean,如果不是仅仅做类型检查,而是创建Bean对象,则需要调用markBeanAsCreated方法进行标识

      合并Bean定义信息

      ① 接着调用getMergedLocalBeanDefinition(beanName)进行Bean定义的合并方法如下:

    protected RootBeanDefinition getMergedLocalBeanDefinition(String beanName) throws BeansException {
            // 快速从缓存中获取,如果不为空,则直接返回
            RootBeanDefinition mbd = this.mergedBeanDefinitions.get(beanName);
            if (mbd != null) {
                return mbd;
            }
            //获取 RootBeanDefinition 对象。若获取的 BeanDefinition 为子 BeanDefinition,则需要合并父类的相关属性.
            return getMergedBeanDefinition(beanName, getBeanDefinition(beanName));
        }

      ② 进入到getMergedBeanDefinition(beanName, getBeanDefinition(beanName))方法:

    protected RootBeanDefinition getMergedBeanDefinition(String beanName, BeanDefinition bd)
                throws BeanDefinitionStoreException {
            //调用重载的方法
            return getMergedBeanDefinition(beanName, bd, null);
        }

      ③ 进入到getMergedBeanDefinition(beanName, bd, null)的方法:

    protected RootBeanDefinition getMergedBeanDefinition(
                String beanName, BeanDefinition bd, @Nullable 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) {
                    //bd.getParentName() == null,表明无父配置,这时直接将当前的BeanDefinition升级为RootBeanDefinition
                    if (bd.getParentName() == null) {
                        //直接把原始的bean定义升级为RootBeanDefinition
                        if (bd instanceof RootBeanDefinition) {
                            mbd = ((RootBeanDefinition) bd).cloneBeanDefinition();
                        }
                        else {
                            //包裹为RootBeanDefinition
                            mbd = new RootBeanDefinition(bd);
                        }
                    }
                    //有父定义
                    else {
                        BeanDefinition pbd;
                        try {
                            /*
                             * 判断父类beanName与子类beanName名称是否相同。若相同,则父类bean一定
                             * 在父容器中。原因也很简单,容器底层是用Map缓存<beanName, bean> 键值对
                             * 的。同一个容器下,使用同一个 beanName 映射两个bean实例显然是不合适的
                             */
                            String parentBeanName = transformedBeanName(bd.getParentName());
                            if (!beanName.equals(parentBeanName)) {
                                pbd = getMergedBeanDefinition(parentBeanName);
                            }
                            else {
                                /*
                                 * 这里再次调用getMergedBeanDefinition,只不过参数值变为了
                                 * parentBeanName,用于合并父BeanDefinition 和爷爷辈的
                                 * BeanDefinition。如果爷爷辈的BeanDefinition仍有父
                                 * BeanDefinition,则继续合并
                                 */
                                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);
                        }
                        //以父BeanDefinition的配置信息为基本创建RootBeanDefinition
                        mbd = new RootBeanDefinition(pbd);
                        //用子BeanDefinition中的属性覆盖父BeanDefinition中的属性
                        mbd.overrideFrom(bd);
                    }
    
                    // 如果用户未配置scope属性,则默认将该属性配置为singleton
                    if (!StringUtils.hasLength(mbd.getScope())) {
                        mbd.setScope(RootBeanDefinition.SCOPE_SINGLETON);
                    }
    
                    // A bean contained in a non-singleton bean cannot be a singleton itself.
                    // Let's correct this on the fly here, since this might be the result of
                    // parent-child merging for the outer bean, in which case the original inner bean
                    // definition will not have inherited the merged outer bean's singleton status.
                    if (containingBd != null && !containingBd.isSingleton() && mbd.isSingleton()) {
                        mbd.setScope(containingBd.getScope());
                    }
    
                    //缓存合并后的BeanDefinition
                    if (containingBd == null && isCacheBeanMetadata()) {
                        this.mergedBeanDefinitions.put(beanName, mbd);
                    }
                }
    
                return mbd;
            }
        }

      ④ 然后检查当前创建的bean定义是不是抽象的bean定义,checkMergedBeanDefinition(mbd, beanName, args)方法:

    protected void checkMergedBeanDefinition(RootBeanDefinition mbd, String beanName, @Nullable Object[] args)
                throws BeanDefinitionStoreException {
    
            //抽象的bean定义是不能够被实例化的
            if (mbd.isAbstract()) {
                throw new BeanIsAbstractException(beanName);
            }
        }

      处理dependsOn的依赖(这个不是我们所谓的循环依赖 而是bean创建前后的依赖)

      ① 进入到isDependent(beanName, dependentBeanName, null)的方法:

    private boolean isDependent(String beanName, String dependentBeanName, @Nullable Set<String> alreadySeen) {
            //alreadySeen已经检测的依赖bean
            if (alreadySeen != null && alreadySeen.contains(beanName)) {
                return false;
            }
            //获取原始beanName
            String canonicalName = canonicalName(beanName);
            //获取创建当前bean所依赖的bean的名称集合
            Set<String> dependentBeans = this.dependentBeanMap.get(canonicalName);
            //不依赖任何前置Bean直接返回
            if (dependentBeans == null) {
                return false;
            }
            //存在,则证明存在已经注册的依赖
            if (dependentBeans.contains(dependentBeanName)) {
                return true;
            }
            //递归检测依赖
            for (String transitiveDependency : dependentBeans) {
                if (alreadySeen == null) {
                    alreadySeen = new HashSet<>();
                }
                //添加到alreadySeen 中
                alreadySeen.add(beanName);
                //递归检查依赖
                if (isDependent(transitiveDependency, dependentBeanName, alreadySeen)) {
                    return true;
                }
            }
            return false;
        }

      ② 进入到保存的是依赖beanName之间的映射关系:依赖beanName -> beanName的集合registerDependentBean(dep, beanName)的方法:

    public void registerDependentBean(String beanName, String dependentBeanName) {
            //获取原始的beanName
            String canonicalName = canonicalName(beanName);
    
            // 添加 <canonicalName, dependentBeanName> 到 dependentBeanMap 中
            synchronized (this.dependentBeanMap) {
                Set<String> dependentBeans =
                        this.dependentBeanMap.computeIfAbsent(canonicalName, k -> new LinkedHashSet<>(8));
                if (!dependentBeans.add(dependentBeanName)) {
                    return;
                }
            }
    
            // 添加 <dependentBeanName, canonicalName> 到 dependenciesForBeanMap 中
            synchronized (this.dependenciesForBeanMap) {
                Set<String> dependenciesForBean =
                        this.dependenciesForBeanMap.computeIfAbsent(dependentBeanName, k -> new LinkedHashSet<>(8));
                dependenciesForBean.add(canonicalName);
            }
        }

      ③ 然后到获取dependsOn的Bean的getBean(dep),就获取到了dependsOn的Bean了;

      处理单实例Bean

      ① 把beanName和一个singletonFactory匿名内部类传入用于回调的getSingleton方法:

    public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {
            Assert.notNull(beanName, "Bean name must not be null");
            //加锁
            synchronized (this.singletonObjects) {
                //尝试从单例缓存池中获取对象
                Object singletonObject = this.singletonObjects.get(beanName);
                if (singletonObject == null) {
                    if (this.singletonsCurrentlyInDestruction) {
                        throw new BeanCreationNotAllowedException(beanName,
                                "Singleton bean creation not allowed while singletons of this factory are in destruction " +
                                "(Do not request a bean from a BeanFactory in a destroy method implementation!)");
                    }
                    if (logger.isDebugEnabled()) {
                        logger.debug("Creating shared instance of singleton bean '" + beanName + "'");
                    }
                    /**
                     * 标记当前的bean马上就要被创建了
                     * singletonsCurrentlyInCreation 在这里会把beanName加入进来,若第二次循环依赖(构造器注入会抛出异常)
                     */
                    beforeSingletonCreation(beanName);
                    boolean newSingleton = false;
                    boolean recordSuppressedExceptions = (this.suppressedExceptions == null);
                    if (recordSuppressedExceptions) {
                        this.suppressedExceptions = new LinkedHashSet<>();
                    }
                    try {
                        //创建bean这个过程其实是调用 createBean() 方法
                        singletonObject = singletonFactory.getObject();
                        newSingleton = true;
                    }
                    catch (IllegalStateException ex) {
                        //回调我们singletonObjects的get方法,进行正在的创建bean的逻辑
                        singletonObject = this.singletonObjects.get(beanName);
                        if (singletonObject == null) {
                            throw ex;
                        }
                    }
                    catch (BeanCreationException ex) {
                        if (recordSuppressedExceptions) {
                            for (Exception suppressedException : this.suppressedExceptions) {
                                ex.addRelatedCause(suppressedException);
                            }
                        }
                        throw ex;
                    }
                    finally {
                        if (recordSuppressedExceptions) {
                            this.suppressedExceptions = null;
                        }
                        //后置处理主要做的事情就是把singletonsCurrentlyInCreation标记正在创建的bean从集合中移除
                        afterSingletonCreation(beanName);
                    }
                    if (newSingleton) {
                        //加入缓存中
                        addSingleton(beanName, singletonObject);
                    }
                }
                return singletonObject;
            }
        }

       第一:先到单例缓存池中获取对象获取,有就返回没有就继续往下

       第二:调用标记当前的bean马上就要被创建了beforeSingletonCreation(beanName)方法:

    protected void beforeSingletonCreation(String beanName) {
            //若singletonsCurrentlyInCreation没有 则添加成功
            if (!this.inCreationCheckExclusions.contains(beanName) && !this.singletonsCurrentlyInCreation.add(beanName)) {
                throw new BeanCurrentlyInCreationException(beanName);
            }
        

      第三:创建Bean的singletonFactory.getObject()其实是调用createBean()方法:

    protected Object createBean(String beanName, RootBeanDefinition mbd, Object[] args) throws BeanCreationException {
            if (logger.isDebugEnabled()) {
                logger.debug("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 {
                // Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
                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);
            }
    
            Object beanInstance = doCreateBean(beanName, mbdToUse, args);
            if (logger.isDebugEnabled()) {
                logger.debug("Finished creating instance of bean '" + beanName + "'");
            }
            return beanInstance;
        }

      真正的创建我们的bean的实例对象的doCreateBean(beanName, mbdToUse, args)的方法:

    protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)
                throws BeanCreationException {
    
            //BeanWrapper是对Bean的包装,其接口中所定义的功能很简单包括设置获取被包装的对象,获取被包装bean的属性描述器
            BeanWrapper instanceWrapper = null;
            if (mbd.isSingleton()) {
                //从没有完成的FactoryBean中移除
                instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
            }
            if (instanceWrapper == null) {
                //使用合适的实例化策略来创建新的实例:工厂方法、构造函数自动注入、简单初始化 比较复杂也很重要
                instanceWrapper = createBeanInstance(beanName, mbd, args);
            }
            //从beanWrapper中获取我们的早期对象
            final Object bean = instanceWrapper.getWrappedInstance();
            Class<?> beanType = instanceWrapper.getWrappedClass();
            if (beanType != NullBean.class) {
                mbd.resolvedTargetType = beanType;
            }
    
            // Allow post-processors to modify the merged bean definition.
            synchronized (mbd.postProcessingLock) {
                if (!mbd.postProcessed) {
                    try {
                        //进行后置处理@AutoWired的注解的预解析
                        applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
                    }
                    catch (Throwable ex) {
                        throw new BeanCreationException(mbd.getResourceDescription(), beanName,
                                "Post-processing of merged bean definition failed", ex);
                    }
                    mbd.postProcessed = true;
                }
            }
    
            /**
             * 该对象进行判断是否能够暴露早期对象的条件
             * 单实例 this.allowCircularReferences 默认为true
             * isSingletonCurrentlyInCreation(表示当前的bean对象正在创建singletonsCurrentlyInCreation包含当前正在创建的bean)
             */
            boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&
                    isSingletonCurrentlyInCreation(beanName));
            //上述条件满足,允许中期暴露对象
            if (earlySingletonExposure) {
                if (logger.isDebugEnabled()) {
                    logger.debug("Eagerly caching bean '" + beanName +
                            "' to allow for resolving potential circular references");
                }
                //把我们的早期对象包装成一个singletonFactory对象 该对象提供了一个getObject方法,该方法内部调用getEarlyBeanReference方法
                addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
            }
    
            // Initialize the bean instance.
            Object exposedObject = bean;
            try {
                //给我们的属性进行赋值(调用set方法进行赋值)
                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) {
                /**
                 * 去缓存中获取到我们的对象 由于传递的allowEarlyReference 是false 要求只能在一级二级缓存中去获取
                 * 正常普通的bean(不存在循环依赖的bean) 创建的过程中,压根不会把三级缓存提升到二级缓存中
                 */
                Object earlySingletonReference = getSingleton(beanName, false);
                //能够获取到
                if (earlySingletonReference != null) {
                    //经过后置处理的bean和早期的bean引用还相等的话(表示当前的bean没有被代理过)
                    if (exposedObject == bean) {
                        exposedObject = earlySingletonReference;
                    }
                    //处理依赖的bean
                    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 " +
                                    "'getBeanNamesOfType' with the 'allowEagerInit' flag turned off, for example.");
                        }
                    }
                }
            }
    
            // Register bean as disposable.
            try {
                //注册销毁的bean的销毁接口
                registerDisposableBeanIfNecessary(beanName, bean, mbd);
            }
            catch (BeanDefinitionValidationException ex) {
                throw new BeanCreationException(
                        mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);
            }
    
            return exposedObject;
        }

      ① 实例化:使用合适的实例化策略来创建新的实例:工厂方法、构造函数自动注入、简单初始化的createBeanInstance方法:

    protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) {
            //从bean定义中解析出当前bean的class对象
            Class<?> beanClass = resolveBeanClass(mbd, beanName);
    
            //检测类的访问权限。默认情况下,对于非 public 的类,是允许访问的。若禁止访问,这里会抛出异常
            if (beanClass != null && !Modifier.isPublic(beanClass.getModifiers()) && !mbd.isNonPublicAccessAllowed()) {
                throw new BeanCreationException(mbd.getResourceDescription(), beanName,
                        "Bean class isn't public, and non-public access not allowed: " + beanClass.getName());
            }
    
            Supplier<?> instanceSupplier = mbd.getInstanceSupplier();
            if (instanceSupplier != null) {
                return obtainFromSupplier(instanceSupplier, beanName);
            }
    
            //工厂方法,我们通过配置类来进行配置的话 采用的就是工厂方法
            if (mbd.getFactoryMethodName() != null) {
                return instantiateUsingFactoryMethod(beanName, mbd, args);
            }
    
            //判断当前构造函数是否被解析过
            boolean resolved = false;
            //有没有必须进行依赖注入
            boolean autowireNecessary = false;
            /**
             * 通过getBean传入进来的构造函数是否来指定需要推断构造函数
             * 若传递进来的args不为空,那么就可以直接选出对应的构造函数
             */
            if (args == null) {
                synchronized (mbd.constructorArgumentLock) {
                    //判断我们的bean定义信息中的resolvedConstructorOrFactoryMethod(用来缓存我们的已经解析的构造函数或者工厂方法)
                    if (mbd.resolvedConstructorOrFactoryMethod != null) {
                        //修改已经解析过的构造函数的标志
                        resolved = true;
                        //修改标记为ture 标识构造函数或者工厂方法已经解析过
                        autowireNecessary = mbd.constructorArgumentsResolved;
                    }
                }
            }
            //若被解析过
            if (resolved) {
                if (autowireNecessary) {
                    //通过有参的构造函数进行反射调用
                    return autowireConstructor(beanName, mbd, null, null);
                }
                else {
                    //调用无参数的构造函数进行创建对象
                    return instantiateBean(beanName, mbd);
                }
            }
    
            //通过bean的后置处理器进行选举出合适的构造函数对象
            Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
            //通过后置处理器解析出构造器对象不为null或获取bean定义中的注入模式是构造器注入或bean定义信息ConstructorArgumentValues或获取通过getBean的方式传入的构造器函数参数类型不为null
            if (ctors != null || mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR ||
                    mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {
                //通过构造函数创建对象
                return autowireConstructor(beanName, mbd, ctors, args);
            }
            //使用无参数的构造函数调用创建对象
            return instantiateBean(beanName, mbd);
        }

      判断是否暴露早期对象条件满足就暴露早期对象,把我们的早期对象包装成一个singletonFactory对象 该对象提供了一个getObject方法,该方法内部调用getEarlyBeanReference方法:

    protected Object getEarlyBeanReference(String beanName, RootBeanDefinition mbd, Object bean) {
            Object exposedObject = bean;
            //判读我们容器中是否有InstantiationAwareBeanPostProcessors类型的后置处理器
            if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
                //获取我们所有的后置处理器
                for (BeanPostProcessor bp : getBeanPostProcessors()) {
                    //判断我们的后置处理器是不是实现了SmartInstantiationAwareBeanPostProcessor接口
                    if (bp instanceof SmartInstantiationAwareBeanPostProcessor) {
                        //进行强制转换
                        SmartInstantiationAwareBeanPostProcessor ibp = (SmartInstantiationAwareBeanPostProcessor) bp;
                        //挨个调用SmartInstantiationAwareBeanPostProcessor的getEarlyBeanReference
                        exposedObject = ibp.getEarlyBeanReference(exposedObject, beanName);
                    }
                }
            }
            return exposedObject;
        }

      addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean))方法:

    /**
         * 该方法用于把早期对象包装成一个ObjectFactory 暴露到三级缓存中 用于将解决循环依赖
         * @param beanName the name of the bean
         * @param singletonFactory the factory for the singleton object
         */
        protected void addSingletonFactory(String beanName, ObjectFactory<?> singletonFactory) {
            Assert.notNull(singletonFactory, "Singleton factory must not be null");
            //加锁
            synchronized (this.singletonObjects) {
                //单例缓存池中没有包含当前的bean
                if (!this.singletonObjects.containsKey(beanName)) {
                    //加入到三级缓存中 暴露早期对象用于解决循环依赖
                    this.singletonFactories.put(beanName, singletonFactory);
                    this.earlySingletonObjects.remove(beanName);
                    this.registeredSingletons.add(beanName);
                }
            }
        }

      ②属性赋值:给我们的属性进行赋值(调用set方法进行赋值)populateBean(beanName, mbd, instanceWrapper)方法:

    /**
         *给我们的对象BeanWrapper属性赋值
         * @param beanName bean的名称
         * @param mbd bean的定义
         * @param bw bean实例包装对象
         */
        protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) {
            //若bw为null的话,则说明对象没有实例化
            if (bw == null) {
                //进入if说明对象有属性,bw为空,不能为他设置属性,那就在下面就执行抛出异常
                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;
                }
            }
    
            /**
             * 在属性被填充前,给 InstantiationAwareBeanPostProcessor 类型的后置处理器一个修改
             * bean 状态的机会。官方的解释是:让用户可以自定义属性注入。比如用户实现一
             * 个 InstantiationAwareBeanPostProcessor 类型的后置处理器,并通过
             * postProcessAfterInstantiation 方法向 bean 的成员变量注入自定义的信息。
             *当时我们发现系统中的的InstantiationAwareBeanPostProcessor.postProcessAfterInstantiationM没有进行任何处理,
             *若我们自己实现了这个接口 可以自定义处理.....spring 留给我们自己扩展接口的
             *特殊需求,直接使用配置中的信息注入即可。
             */
            boolean continueWithPropertyPopulation = true;
            //是否持有 InstantiationAwareBeanPostProcessor
            if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
                //获取容器中的所有的BeanPostProcessor
                for (BeanPostProcessor bp : getBeanPostProcessors()) {
                    //判断我们的后置处理器是不是InstantiationAwareBeanPostProcessor
                    if (bp instanceof InstantiationAwareBeanPostProcessor) {
                        //进行强制转化
                        InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
                        //若存在后置处理器给我们属性赋值了,那么返回false 可以来修改我们的开关变量,就不会走下面的逻辑了
                        if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
                            // 返回值为是否继续填充 bean
                            // postProcessAfterInstantiation:如果应该在 bean上面设置属性则返回 true,否则返回 false
                            // 一般情况下,应该是返回true 。
                            // 返回 false 的话,将会阻止在此 Bean 实例上调用任何后续的 InstantiationAwareBeanPostProcessor 实
                            continueWithPropertyPopulation = false;
                            break;
                        }
                    }
                }
            }
            // 如果后续处理器发出停止填充命令,则终止后续操作
            if (!continueWithPropertyPopulation) {
                return;
            }
    
            //获取bean定义的属性
            PropertyValues pvs = (mbd.hasPropertyValues() ? mbd.getPropertyValues() : null);
    
            /**
             * 判断我们的bean的属性注入模型
             * AUTOWIRE_BY_NAME 根据名称注入
             * AUTOWIRE_BY_TYPE 根据类型注入
             */
    
            if (mbd.getResolvedAutowireMode() == AUTOWIRE_BY_NAME || mbd.getResolvedAutowireMode() == AUTOWIRE_BY_TYPE) {
                //把PropertyValues封装成为MutablePropertyValues
                MutablePropertyValues newPvs = new MutablePropertyValues(pvs);
                //根据bean的属性名称注入
                if (mbd.getResolvedAutowireMode() == AUTOWIRE_BY_NAME) {
                    autowireByName(beanName, mbd, bw, newPvs);
                }
                //根据bean的类型进行注入
                if (mbd.getResolvedAutowireMode() == AUTOWIRE_BY_TYPE) {
                    autowireByType(beanName, mbd, bw, newPvs);
                }
                //把处理过的 属性覆盖原来的
                pvs = newPvs;
            }
    
            /**
             * 这里又是一种后置处理,用于在 Spring 填充属性到 bean 对象前,对属性的值进行相应的处理,
             * 比如可以修改某些属性的值。这时注入到 bean 中的值就不是配置文件中的内容了,
             * 而是经过后置处理器修改后的内容
             */
            boolean hasInstAwareBpps = hasInstantiationAwareBeanPostProcessors();
            //判断是否需要检查依赖
            boolean needsDepCheck = (mbd.getDependencyCheck() != AbstractBeanDefinition.DEPENDENCY_CHECK_NONE);
    
            if (hasInstAwareBpps || needsDepCheck) {
                if (pvs == null) {
                    pvs = mbd.getPropertyValues();
                }
                //提出当前正在创建的beanWrapper 依赖的对象
                PropertyDescriptor[] filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
                if (hasInstAwareBpps) {
                    //获取所有的后置处理器
                    for (BeanPostProcessor bp : getBeanPostProcessors()) {
                        if (bp instanceof InstantiationAwareBeanPostProcessor) {
                            InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
                            //对依赖对象进行后置处理
                            pvs = ibp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);
                            if (pvs == null) {
                                return;
                            }
                        }
                    }
                }
                //判断是否检查依赖
                if (needsDepCheck) {
                    checkDependencies(beanName, mbd, filteredPds, pvs);
                }
            }
    
            /**
             * 其实,上面只是完成了所有注入属性的获取,将获取的属性封装在 PropertyValues 的实例对象 pvs 中,
             * 并没有应用到已经实例化的 bean 中。而 #applyPropertyValues(String beanName, BeanDefinition mbd, BeanWrapper bw, PropertyValues pvs) 方法,
             * 则是完成这一步骤的
             */
            if (pvs != null) {
                applyPropertyValues(beanName, mbd, bw, pvs);
            }
        }

       ③初始化:进行对象初始化操作调用initializeBean,这里会进行Aware接口进行方法的回调,然后调用Bean的后置处理器的Before方法(postProcessorsBeforeInitialization),然后Bean的初始化方法,最后调用Bean的后置处理器的After方法(PostProcessorsAfterInitialization)

    protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {
            if (System.getSecurityManager() != null) {
                AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
                    invokeAwareMethods(beanName, bean);
                    return null;
                }, getAccessControlContext());
            }
            else {
                //若我们的Bean实现了Aware接口进行方法的回调
                invokeAwareMethods(beanName, bean);
            }
    
            Object wrappedBean = bean;
            if (mbd == null || !mbd.isSynthetic()) {
                //调用我们的bean的后置处理器的postProcessorsBeforeInitialization方法
                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()) {
                //调用我们bean的后置处理器的PostProcessorsAfterInitialization方法 动态代理就是在这里实现的
                wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
            }
    
            return wrappedBean;
        }

      进入调用初始化方法invokeInitMethods(beanName, wrappedBean, mbd)方法:

    protected void invokeInitMethods(String beanName, final Object bean, @Nullable RootBeanDefinition mbd)
                throws Throwable {
    
            //判断我们的容器中是否实现了InitializingBean接口
            boolean isInitializingBean = (bean instanceof InitializingBean);
            if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) {
                if (logger.isDebugEnabled()) {
                    logger.debug("Invoking afterPropertiesSet() on bean with name '" + beanName + "'");
                }
                if (System.getSecurityManager() != null) {
                    try {
                        AccessController.doPrivileged((PrivilegedExceptionAction<Object>) () -> {
                            ((InitializingBean) bean).afterPropertiesSet();
                            return null;
                        }, getAccessControlContext());
                    }
                    catch (PrivilegedActionException pae) {
                        throw pae.getException();
                    }
                }
                else {
                    //回调InitializingBean的afterPropertiesSet()方法
                    ((InitializingBean) bean).afterPropertiesSet();
                }
            }
    
            if (mbd != null && bean.getClass() != NullBean.class) {
                //我们beanClass中看是否有自己定义的init方法
                String initMethodName = mbd.getInitMethodName();
                //判断自定义的init方法名称不叫afterPropertiesSet
                if (StringUtils.hasLength(initMethodName) &&
                        !(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) &&
                        !mbd.isExternallyManagedInitMethod(initMethodName)) {
                    //调用我们自己的初始化方法
                    invokeCustomInitMethod(beanName, bean, mbd);
                }
            }
        }

      至此doCreateBean创建完成然后返回

      接下来bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd),为什么不直接等于sharedInstance,原因可能刚刚创建的Bean是FactoryBean类型的Bean,如果是就要调用getObject方法来获取真正的Bean,运用场景就是那些创建Bean的逻辑比较复杂的情况下可以用这个,比如Spring整合Mybatis的SqlSessionFactoryBean

      getObjectForBeanInstance(sharedInstance, name, beanName, mbd)方法:

    protected Object getObjectForBeanInstance(
                Object beanInstance, String name, String beanName, @Nullable RootBeanDefinition mbd) {
    
            // 如果name以&开头,但beanInstance却不是FactoryBean,则认为有问题。
            if (BeanFactoryUtils.isFactoryDereference(name)) {
                if (beanInstance instanceof NullBean) {
                    return beanInstance;
                }
                if (!(beanInstance instanceof FactoryBean)) {
                    throw new BeanIsNotAFactoryException(beanName, beanInstance.getClass());
                }
            }
    
              /**
                 * 如果上面的判断通过了,表明 beanInstance 可能是一个普通的 bean,也可能是一个
                 * FactoryBean。如果是一个普通的 bean,这里直接返回 beanInstance 即可。如果是
                 * FactoryBean,则要调用工厂方法生成一个 bean 实例。
               */
            if (!(beanInstance instanceof FactoryBean) || BeanFactoryUtils.isFactoryDereference(name)) {
                return beanInstance;
            }
    
            Object object = null;
            if (mbd == null) {
                /**
                 * 如果 mbd 为空,则从缓存中加载 bean。FactoryBean 生成的单例 bean 会被缓存
                 * 在 factoryBeanObjectCache 集合中,不用每次都创建
                 */
                object = getCachedObjectForFactoryBean(beanName);
            }
            if (object == null) {
                // 经过前面的判断,到这里可以保证beanInstance是 FactoryBean类型的,所以可以进行类型转换
                FactoryBean<?> factory = (FactoryBean<?>) beanInstance;
                // 如果 mbd 为空,则判断是否存在名字为 beanName 的 BeanDefinition
                if (mbd == null && containsBeanDefinition(beanName)) {
                    mbd = getMergedLocalBeanDefinition(beanName);
                }
                //synthetic 字面意思是"合成的"。通过全局查找,我发现在 AOP 相关的类中会将该属性设为 true。
                //所以我觉得该字段可能表示某个 bean 是不是被 AOP 增强过,也就是 AOP 基于原始类合成了一个新的代理类。
                //不过目前只是猜测,没有深究
                boolean synthetic = (mbd != null && mbd.isSynthetic());
                //调用 getObjectFromFactoryBean 方法继续获取实例
                object = getObjectFromFactoryBean(factory, beanName, !synthetic);
            }
            return object;
        }

      接着调用object = getObjectFromFactoryBean(factory, beanName, !synthetic)方法:

    protected Object getObjectFromFactoryBean(FactoryBean<?> factory, String beanName, boolean shouldPostProcess) {
               /**
                 * FactoryBean 也有单例和非单例之分,针对不同类型的 FactoryBean,这里有两种处理方式:
                 *   1. 单例 FactoryBean 生成的 bean 实例也认为是单例类型。需放入缓存中,供后续重复使用
                 *   2. 非单例 FactoryBean 生成的 bean 实例则不会被放入缓存中,每次都会创建新的实例
                 **/
            if (factory.isSingleton() && containsSingleton(beanName)) {
                synchronized (getSingletonMutex()) {
                    //从缓存中取bean实例,避免多次创建bean实例
                    Object object = this.factoryBeanObjectCache.get(beanName);
                    if (object == null) {
                        //使用工厂对象中创建实例
                        object = doGetObjectFromFactoryBean(factory, beanName);
                        // 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) {
                                //判断当地的bean是否正在创建
                                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);
                                }
                            }
                            // 这里的beanName对应于FactoryBean的实现类,FactoryBean的实现类也会被实例化,并被缓存在singletonObjects中
                            if (containsSingleton(beanName)) {
                                // 这里的beanName对应于FactoryBean的实现类,FactoryBean的实现类也会被实例化,并被缓存在singletonObjects中
                                this.factoryBeanObjectCache.put(beanName, object);
                            }
                        }
                    }
                    return object;
                }
            }
            else {
                Object object = doGetObjectFromFactoryBean(factory, beanName);
                if (shouldPostProcess) {
                    try {
                        object = postProcessObjectFromFactoryBean(object, beanName);
                    }
                    catch (Throwable ex) {
                        throw new BeanCreationException(beanName, "Post-processing of FactoryBean's object failed", ex);
                    }
                }
                return object;
            }
        }

      使用工厂对象中创建实例object = doGetObjectFromFactoryBean(factory, beanName)方法:

    private Object doGetObjectFromFactoryBean(final FactoryBean<?> factory, final 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 {
                    //真正的调用工厂bean的getObject()方法
                    object = factory.getObject();
                }
            }
            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;
        }

      处理多实例Bean

      mbd.isPrototype(),每次使用的时候再创建,因为不会加入到单实例缓冲池中,也就无法解决循环依赖问题。

      至此doGetBean创建完成,返回,getBean创建完成

      最后获取所有的bean的名称(至此所有的单实例的bean已经加入到单实例Bean的缓存池中,所谓的单实例缓存池实际上就是一个ConcurrentHashMap),遍历所有的bean名称,根据beanName从单例缓存池中获取所有的对象,然后判断是否是SmartInitializingSingleton类型,是再触发实例化之后的方法afterSingletonsInstantiated;

      完整的Spring IoC源码解析见:Spring系列(三):Spring IoC源码解析

    三、getBean流程图

      ① getBean流程图:

      ② @AutoWired注入属性和set方法注入流程图:

     

      总结:通过对Spring IoC的getBean流程分析,了解了Bean的创建过程,先到单实例缓存池(ConcurrentHashMap)中获取,取不到就调用createBean创建,创建成功后加入到单实例缓存池(ConcurrentHashMap)中,下次获取的时候直接从JVM级别的缓存中获取,Bean的生命周期,以及如何用三级缓存解决循环依赖,还有就是多实例为什么不能解决循环依赖问题。

  • 相关阅读:
    使用taobao的npm镜像源,同时安装nrm镜像工具
    文档工具
    javascript基础语法备忘录-变量和数据类型
    a :hover 和a:hover 区别
    我使用的brackets插件
    使用git将自己的代码同时保存在多个代码托管平台
    mac os安装macvim
    ubuntu下安装录屏软件
    解决 eclipse cdt 运行时控制台乱码解决
    Chrome开发者工具详解(五)之Network面板
  • 原文地址:https://www.cnblogs.com/toby-xu/p/11333479.html
Copyright © 2020-2023  润新知