zoukankan      html  css  js  c++  java
  • 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的生命周期,以及如何用三级缓存解决循环依赖,还有就是多实例为什么不能解决循环依赖问题。

  • 相关阅读:
    Interview with BOA
    Java Main Differences between HashMap HashTable and ConcurrentHashMap
    Java Main Differences between Java and C++
    LeetCode 33. Search in Rotated Sorted Array
    LeetCode 154. Find Minimum in Rotated Sorted Array II
    LeetCode 153. Find Minimum in Rotated Sorted Array
    LeetCode 75. Sort Colors
    LeetCode 31. Next Permutation
    LeetCode 60. Permutation Sequence
    LeetCode 216. Combination Sum III
  • 原文地址:https://www.cnblogs.com/toby-xu/p/11333479.html
Copyright © 2011-2022 走看看