Spring beanのロードプロセスのソースコードの分析

42799 ワード

spring-beans     DI、IOC     ;Bean       BeanFactory, IOC  、    、               ~

       DefaultListableBeanFactory       ,        DefaultListableBeanFactory      IOC  ,bean             
       public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory
            implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {

       public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory
               implements AutowireCapableBeanFactory {
              
Spring bean    
 - Spring bean     、    
 - Spring bean    
 - Spring BeanDefinition    
 - Spring bean class    
   -  AbstractAutowireCapableBeanFactory#createBean ,resolveBeanClass
 - Spring bean      
   -  AbstractAutowireCapableBeanFactory#createBean ,resolveBeforeInstantiation 
 - Spring bean      
   -  AbstractAutowireCapableBeanFactory#populateBean ,postProcessAfterInstantiation 
 - Spring bean      
   -  AbstractAutowireCapableBeanFactory#populateBean 
 - Spring bean Aware      
   -  AbstractAutowireCapableBeanFactory#initializeBean ,invokeAwareMethods
 - Spring bean      
   -  AbstractAutowireCapableBeanFactory#initializeBean ,applyBeanPostProcessorsBeforeInitialization
 - Spring bean     
   -  AbstractAutowireCapableBeanFactory#initializeBean ,invokeInitMethods
 - Spring bean      
   -  AbstractAutowireCapableBeanFactory#initializeBean ,applyBeanPostProcessorsAfterInitialization
 - Spring bean    
 
                
 -    :                   new     ,         
 -    :               
       
              
       Spring Bean     , AbstractBeanFactory getBean    ~~~


getBean     ,  bean  
   @Override
   public  T getBean(String name, Class requiredType) throws BeansException {
      return doGetBean(name, requiredType, null, false);
   }
               
   protected  T doGetBean(final String name, @Nullable final Class requiredType,
         @Nullable final Object[] args, boolean typeCheckOnly) throws BeansException {

      //      beanName
      final String beanName = transformedBeanName(name);
      Object bean;

      // Eagerly check singleton cache for manually registered singletons.
      //                     ,       ObjectFactory      
      //   singletonFactories          bean     populate      (           @Autowired               )
      Object sharedInstance = getSingleton(beanName);
      if (sharedInstance != null && args == null) {
         if (logger.isTraceEnabled()) {
            if (isSingletonCurrentlyInCreation(beanName)) {
               logger.trace("Returning eagerly cached instance of singleton bean '" + beanName +
                     "' that is not fully initialized yet - a consequence of a circular reference");
            }
            else {
               logger.trace("Returning cached instance of singleton bean '" + beanName + "'");
            }
         }

         //        ,       BeanFactory                           
         bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
      }

      else {
         // Fail if we're already creating this bean instance:
         // We're assumably within a circular reference.
         // Prototype          ,     Prototype   bean    
         if (isPrototypeCurrentlyInCreation(beanName)) {
            throw new BeanCurrentlyInCreationException(beanName);
         }

         // Check if bean definition exists in this factory.
         //   beanDefinitionMap                 beanName     parentBeanFactory   
         BeanFactory parentBeanFactory = getParentBeanFactory();
         //          XML        beanName      ,    parentBeanFactory     
         if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {
            // Not found -> check parent.
            String nameToLookup = originalBeanName(name);
            if (parentBeanFactory instanceof AbstractBeanFactory) {
               return ((AbstractBeanFactory) parentBeanFactory).doGetBean(
                     nameToLookup, requiredType, args, typeCheckOnly);
            }
            else if (args != null) {
               // Delegation to parent with explicit args.
               return (T) parentBeanFactory.getBean(nameToLookup, args);
            }
            else if (requiredType != null) {
               // No args -> delegate to standard getBean method.
               return parentBeanFactory.getBean(nameToLookup, requiredType);
            }
            else {
               return (T) parentBeanFactory.getBean(nameToLookup);
            }
         }

         //                bean,       
         if (!typeCheckOnly) {
            markBeanAsCreated(beanName);
         }

         try {
            //    XML     GenericBeanDefinition   RootBeanDefinition,   
            //   beanName  Bean             
            //    XML        Bean      GenericBeanDefinition  ,           RootBeanDefinition
            final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
            checkMergedBeanDefinition(mbd, beanName, args);

            // Guarantee initialization of beans that the current bean depends on.
            String[] dependsOn = mbd.getDependsOn();
            //                 bean
            //        ,   depends-on, 
            if (dependsOn != null) {
               for (String dep : dependsOn) {
                  if (isDependent(beanName, dep)) {
                     throw new BeanCreationException(mbd.getResourceDescription(), beanName,
                           "Circular depends-on relationship between '" + beanName + "' and '" + dep + "'");
                  }
                  //       
                  registerDependentBean(dep, beanName);
                  try {
                     getBean(dep);
                  }
                  catch (NoSuchBeanDefinitionException ex) {
                     throw new BeanCreationException(mbd.getResourceDescription(), beanName,
                           "'" + beanName + "' depends on missing bean '" + dep + "'", ex);
                  }
               }
            }

            //       bean       mbd   
            //     singleton、prototype   scope  bean,         
            if (mbd.isSingleton()) {
               sharedInstance = getSingleton(beanName, () -> {
                  try {
                      //      
                     return createBean(beanName, mbd, args);
                  }
                  catch (BeansException ex) {
                     // Explicitly remove instance from singleton cache: It might have been put there
                     // eagerly by the creation process, to allow for circular reference resolution.
                     // Also remove any beans that received a temporary reference to the bean.
                     destroySingleton(beanName);
                     throw ex;
                  }
               });
               //    !!!          bean     "  "
               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 {
               //    scope    bean, request 
               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;
         }
      }

      //        "    "   bean        ,            bean     ,             
      // Check if required type matches the type of the actual bean instance.
      if (requiredType != null && !requiredType.isInstance(bean)) {
         try {
            T convertedBean = getTypeConverter().convertIfNecessary(bean, requiredType);
            if (convertedBean == null) {
               throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());
            }
            return convertedBean;
         }
         catch (TypeMismatchException ex) {
            if (logger.isTraceEnabled()) {
               logger.trace("Failed to convert bean '" + name + "' to required type '" +
                     ClassUtils.getQualifiedName(requiredType) + "'", ex);
            }
            throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());
         }
      }
      return (T) bean;
   }           
            :
   -   transformedBeanName        beanName,          ,getBean     name        beanName
   -   bean  ,       ,     if else  ,   singleton    if        bean  ,      else  bean  ;        else  bean  
   -     bean             




getSingleton(String beanName)         bean  
    // DefaultSingletonBeanRegistry#getSingleton
       public Object getSingleton(String beanName) {
          // true          
          return getSingleton(beanName, true);
       }
       
   protected Object getSingleton(String beanName, boolean allowEarlyReference) {
      //            ,    
      Object singletonObject = this.singletonObjects.get(beanName);
      //          &        
      if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
         synchronized (this.singletonObjects) {
            //    bean        ,    
            singletonObject = this.earlySingletonObjects.get(beanName);
            //         &      (             ObjectFactory)
            if (singletonObject == null && allowEarlyReference) {
               //                    addSingletonFactory    factory        singletonFactories
               ObjectFactory> singletonFactory = this.singletonFactories.get(beanName);
               if (singletonFactory != null) {
                  singletonObject = singletonFactory.getObject();
                  //            
                  this.earlySingletonObjects.put(beanName, singletonObject);
                  this.singletonFactories.remove(beanName);
               }
            }
         }
      }
      return singletonObject;
   }
getObject ForBenInstanceが「欲しい」というbeanのインスタンスを獲得しました.
FactoryBernを使用する場合がありますので、ユーザーがFactoryBernのインスタンスを望んでいるのか、それともFactoryBern.getObject()に対応しているのかを判断する必要があります.
     // AbstractBeanFactory#getObjectForBeanInstance
       protected Object getObjectForBeanInstance(
             Object beanInstance, String name, String beanName, @Nullable RootBeanDefinition mbd) {
   
          // Don't let calling code try to dereference the factory if the bean isn't a factory.
          //      name     ( &   ) beanInstance   FactoryBean        
          if (BeanFactoryUtils.isFactoryDereference(name)) {
             if (beanInstance instanceof NullBean) {
                return beanInstance;
             }
             if (!(beanInstance instanceof FactoryBean)) {
                throw new BeanIsNotAFactoryException(beanName, beanInstance.getClass());
             }
             if (mbd != null) {
                mbd.isFactoryBean = true;
             }
             return beanInstance;
          }
   
          // Now we have the bean instance, which may be a normal bean or a FactoryBean.
          // If it's a FactoryBean, we use it to create a bean instance, unless the
          // caller actually wants a reference to the factory.
          //         bean  ,            bean  FactoryBean
          //    FactoryBean         ,                      getObject()       
          //      name      &
          if (!(beanInstance instanceof FactoryBean)) {
             return beanInstance;
          }
   
          Object object = null;
          if (mbd != null) {
             mbd.isFactoryBean = true;
          }
          else {
              //         bean
             object = getCachedObjectForFactoryBean(beanName);
          }
          if (object == null) {
             // Return bean instance from factory.
             FactoryBean> factory = (FactoryBean>) beanInstance;
             // Caches object obtained from FactoryBean if it is a singleton.
             if (mbd == null && containsBeanDefinition(beanName)) {
                mbd = getMergedLocalBeanDefinition(beanName);
             }
             //                     
             boolean synthetic = (mbd != null && mbd.isSynthetic());
             //  Factory   bean
             object = getObjectFromFactoryBean(factory, beanName, !synthetic);
          }
          return object;
       }
       
       // FactoryBeanRegistrySupport#getObjectFromFactoryBean
   protected Object getObjectFromFactoryBean(FactoryBean> factory, String beanName, boolean shouldPostProcess) {
      if (factory.isSingleton() && containsSingleton(beanName)) {
         synchronized (getSingletonMutex()) {
            Object object = this.factoryBeanObjectCache.get(beanName);
            if (object == null) {
               //      FactoryBean    bean
               //     getObject()  
               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) {
                     if (isSingletonCurrentlyInCreation(beanName)) {
                        // Temporarily return non-post-processed object, not storing it yet..
                        return object;
                     }
                     // bean          
                     beforeSingletonCreation(beanName);
                     try {
                        //   ObjectFactory     
                        object = postProcessObjectFromFactoryBean(object, beanName);
                     }
                     catch (Throwable ex) {
                        throw new BeanCreationException(beanName,
                              "Post-processing of FactoryBean's singleton object failed", ex);
                     }
                     finally {
                        // bean          
                        afterSingletonCreation(beanName);
                     }
                  }
                  if (containsSingleton(beanName)) {
                     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;
      }
   }
       
       // AbstractAutowireCapableBeanFactory#postProcessObjectFromFactoryBean
   protected Object postProcessObjectFromFactoryBean(Object object, String beanName) {
      // Spring  bean         :       bean           BeanPostProcessor postProcessAfterInitialization      
      //                          
      return applyBeanPostProcessorsAfterInitialization(object, beanName);
   }
       
       // AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsAfterInitialization
   public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
         throws BeansException {

      Object result = existingBean;
      for (BeanPostProcessor processor : getBeanPostProcessors()) {
         //          
         Object current = processor.postProcessAfterInitialization(result, beanName);
         if (current == null) {
            return result;
         }
         result = current;
      }
      return result;
   }      
      
get Singletonは単例getSingleton(String beanName,Object Factory>singleton Factory)を取得します.
    // DefaultSingletonBeanRegistry#getSingleton
    //          bean  ,            singletonFactory.getObject()        
   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      ,               
            beforeSingletonCreation(beanName);
            boolean newSingleton = false;
            boolean recordSuppressedExceptions = (this.suppressedExceptions == null);
            if (recordSuppressedExceptions) {
               this.suppressedExceptions = new LinkedHashSet<>();
            }
            try {
               //    bean
               //            ,             
               singletonObject = singletonFactory.getObject();
               newSingleton = true;
            }
            catch (IllegalStateException ex) {
               // Has the singleton object implicitly appeared in the meantime ->
               // if yes, proceed with it since the exception indicates that state.
               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;
               }
               //  beforeSingletonCreation   ,       
               afterSingletonCreation(beanName);
            }
            if (newSingleton) {
               addSingleton(beanName, singletonObject);
            }
         }
         return singletonObject;
      }
   }
   
   protected void beforeSingletonCreation(String beanName) {
      //       ,         bean      ,               
      if (!this.inCreationCheckExclusions.contains(beanName) && !this.singletonsCurrentlyInCreation.add(beanName)) {
         throw new BeanCurrentlyInCreationException(beanName);
      }
   }
   
   protected void afterSingletonCreation(String beanName) {
      //        bean          
      if (!this.inCreationCheckExclusions.contains(beanName) && !this.singletonsCurrentlyInCreation.remove(beanName)) {
         throw new IllegalStateException("Singleton '" + beanName + "' isn't currently in creation");
      }
   }     
   
   protected void addSingleton(String beanName, Object singletonObject) {
      //              bean             
      synchronized (this.singletonObjects) {
         this.singletonObjects.put(beanName, singletonObject);
         this.singletonFactories.remove(beanName);
         this.earlySingletonObjects.remove(beanName);
         this.registeredSingletons.add(beanName);
      }
   }
   
createBean     Bean
  createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
                 ,   createBean   bean  
       if (mbd.isSingleton()) {
                        sharedInstance = getSingleton(beanName, () -> {
                            try {
                                return createBean(beanName, mbd, args);
                            }
                            catch (BeansException ex) {
                                // Explicitly remove instance from singleton cache: It might have been put there
                                // eagerly by the creation process, to allow for circular reference resolution.
                                // Also remove any beans that received a temporary reference to the bean.
                                destroySingleton(beanName);
                                throw ex;
                            }
                        });
                        bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
       }   
       
        // AbstractAutowireCapableBeanFactory#createBean
       protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
             throws BeanCreationException {
    
          if (logger.isTraceEnabled()) {
             logger.trace("Creating instance of bean '" + beanName + "'");
          }
          RootBeanDefinition mbdToUse = mbd;
    
          // Make sure bean class is actually resolved at this point, and
          // clone the bean definition in case of a dynamically resolved Class
          // which cannot be stored in the shared merged bean definition.
          //   class,      class      className   class
          Class> resolvedClass = resolveBeanClass(mbd, beanName);
          if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {
             mbdToUse = new RootBeanDefinition(mbd);
             mbdToUse.setBeanClass(resolvedClass);
          }
    
          // Prepare method overrides.
          //           
          // Spring      lookup-method replace-method ,                    BeanDefinition  
          // methodOverrieds   ,              
          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.
             //  BeanPostProcessors                 
             //     Spring Bean           
             Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
             if (bean != null) {
                return bean;
             }
          }
          catch (Throwable ex) {
             throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName,
                   "BeanPostProcessor before instantiation of bean failed", ex);
          }
    
          try {
              //            return,              bean  
             Object beanInstance = doCreateBean(beanName, mbdToUse, args);
             if (logger.isTraceEnabled()) {
                logger.trace("Finished creating instance of bean '" + beanName + "'");
             }
             return beanInstance;
          }
          catch (BeanCreationException | ImplicitlyAppearedSingletonException ex) {
             // A previously detected exception with proper bean creation context already,
             // or illegal singleton state to be communicated up to DefaultSingletonBeanRegistry.
             throw ex;
          }
          catch (Throwable ex) {
             throw new BeanCreationException(
                   mbdToUse.getResourceDescription(), beanName, "Unexpected exception during bean creation", ex);
          }
       }
    
        //          ,  object  null,      ,             
       protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
          Object bean = null;
          //        
          if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
             // Make sure bean class is actually resolved at this point.
             if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
                Class> targetType = determineTargetType(beanName, mbd);
                if (targetType != null) {
                   bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
                   if (bean != null) {
                      //                             (  resolveBeforeInstantiation        -bean   null      )
                      //        bean          
                      bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
                   }
                }
             }
             mbd.beforeInstantiationResolved = (bean != null);
          }
          return bean;
       }      
       
          ,            bean       doCreateBean  
   


doCreateBean   Bean
 doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)
    // AbstractAutowireCapableBeanFactory#doCreateBean
   protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)
         throws BeanCreationException {
  
      // Instantiate the bean.
      //        bean,     bean,       
      BeanWrapper instanceWrapper = null;
      if (mbd.isSingleton()) {
         instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
      }
      if (instanceWrapper == null) {
          //      bean
          //     bean             , :    ,        、     
         instanceWrapper = createBeanInstance(beanName, mbd, args);
      }
      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 {
                // MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition    
               applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
            }
            catch (Throwable ex) {
               throw new BeanCreationException(mbd.getResourceDescription(), beanName,
                     "Post-processing of merged bean definition failed", ex);
            }
            mbd.postProcessed = true;
         }
      }
  
      // Eagerly cache singletons to be able to resolve circular references
      // even when triggered by lifecycle interfaces like BeanFactoryAware.
        //            :    &      &        
      boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&
            isSingletonCurrentlyInCreation(beanName));
      //                
      //  -   ,   bean     ,             ,          ~
      //  -              ObjectFactory    ,                 
      //               ObjectFactory.getObject(),      bean               
      if (earlySingletonExposure) {
         if (logger.isTraceEnabled()) {
            logger.trace("Eagerly caching bean '" + beanName +
                  "' to allow for resolving potential circular references");
         }
         //      bean   ObjectFactory  SingletonFactory   
         //        AOP      advice    bean ,         bean,      
         addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
      }
  
      // Initialize the bean instance.
      Object exposedObject = bean;
      try {
          //          
         populateBean(beanName, mbd, instanceWrapper);
         //                   
         //           init-method  ,         ,         
         exposedObject = initializeBean(beanName, exposedObject, mbd);
      }
      catch (Throwable ex) {
         if (ex instanceof BeanCreationException && beanName.equals(((BeanCreationException) ex).getBeanName())) {
            throw (BeanCreationException) ex;
         }
         else {
            throw new BeanCreationException(
                  mbd.getResourceDescription(), beanName, "Initialization of bean failed", ex);
         }
      }
  
      if (earlySingletonExposure) {
         Object earlySingletonReference = getSingleton(beanName, false);
         // earlySingletonReference                    
         if (earlySingletonReference != null) {
             //   exposedObject            ,        
            if (exposedObject == bean) {
               exposedObject = earlySingletonReference;
            }
            else if (!this.allowRawInjectionDespiteWrapping && hasDependentBean(beanName)) {
               String[] dependentBeans = getDependentBeans(beanName);
               Set actualDependentBeans = new LinkedHashSet<>(dependentBeans.length);
               for (String dependentBean : dependentBeans) {
                  //     
                  if (!removeSingletonIfCreatedForTypeCheckOnly(dependentBean)) {
                     actualDependentBeans.add(dependentBean);
                  }
               }
               //   bean        bean        
               // actualDependentBeans        bean       bean        ,          
               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 {
          //      destroy-method,                 
         registerDisposableBeanIfNecessary(beanName, bean, mbd);
      }
      catch (BeanDefinitionValidationException ex) {
         throw new BeanCreationException(
               mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);
      }
  
      return exposedObject;
   }   
   
createBeanInstance   bean   ,   new  ,         
   protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) {
      // Make sure bean class is actually resolved at this point.
      Class> beanClass = resolveBeanClass(mbd, beanName);
 
      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);
      }
 
      //                      
      //    RootBeanDefinition   factoryMethodName  ,            factory-method
      if (mbd.getFactoryMethodName() != null) {
         return instantiateUsingFactoryMethod(beanName, mbd, args);
      }
 
      // Shortcut when re-creating the same bean...
      boolean resolved = false;
      boolean autowireNecessary = false;
      if (args == null) {
         synchronized (mbd.constructorArgumentLock) {
            //           ,             ,                           
            if (mbd.resolvedConstructorOrFactoryMethod != null) {
               resolved = true;
               autowireNecessary = mbd.constructorArgumentsResolved;
            }
         }
      }
      //                            
      if (resolved) {
         if (autowireNecessary) {
            //         
            return autowireConstructor(beanName, mbd, null, null);
         }
         else {
            //           
            //      (  or    )
            return instantiateBean(beanName, mbd);
         }
      }
 
      // Candidate constructors for autowiring?
      //             
      Constructor>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
      if (ctors != null || mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR ||
            mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {
         return autowireConstructor(beanName, mbd, ctors, args);
      }
 
      // Preferred constructors for default construction?
      ctors = mbd.getPreferredConstructors();
      if (ctors != null) {
         return autowireConstructor(beanName, mbd, ctors, null);
      }
 
      // No special handling: simply use no-arg constructor.
      return instantiateBean(beanName, mbd);
   } 
   
  
populateBean     ,             
    // AbstractAutowireCapableBeanFactory#populateBean
   protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) {
      if (bw == null) {
         if (mbd.hasPropertyValues()) {
            throw new BeanCreationException(
                  mbd.getResourceDescription(), beanName, "Cannot apply property values to null instance");
         }
         else {
            // Skip property population phase for null instance.
            return;
         }
      }

      // Give any InstantiationAwareBeanPostProcessors the opportunity to modify the
      // state of the bean before properties are set. This can be used, for example,
      // to support styles of field injection.
      //           
      //  InstantiationAwareBeanPostProcessor               bean
      if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
         for (BeanPostProcessor bp : getBeanPostProcessors()) {
            if (bp instanceof InstantiationAwareBeanPostProcessor) {
               InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
               //           bean
               if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
                  return;
               }
            }
         }
      }

      PropertyValues pvs = (mbd.hasPropertyValues() ? mbd.getPropertyValues() : null);

      int resolvedAutowireMode = mbd.getResolvedAutowireMode();
      if (resolvedAutowireMode == AUTOWIRE_BY_NAME || resolvedAutowireMode == AUTOWIRE_BY_TYPE) {
         MutablePropertyValues newPvs = new MutablePropertyValues(pvs);
         // Add property values based on autowire by name if applicable.
         //         
         if (resolvedAutowireMode == AUTOWIRE_BY_NAME) {
            autowireByName(beanName, mbd, bw, newPvs);
         }
         // Add property values based on autowire by type if applicable.
         //         
         if (resolvedAutowireMode == AUTOWIRE_BY_TYPE) {
            autowireByType(beanName, mbd, bw, newPvs);
         }
         pvs = newPvs;
      }

      //          
      boolean hasInstAwareBpps = hasInstantiationAwareBeanPostProcessors();
      //       
      boolean needsDepCheck = (mbd.getDependencyCheck() != AbstractBeanDefinition.DEPENDENCY_CHECK_NONE);

      PropertyDescriptor[] filteredPds = null;
      if (hasInstAwareBpps) {
         if (pvs == null) {
            pvs = mbd.getPropertyValues();
         }
         for (BeanPostProcessor bp : getBeanPostProcessors()) {
            if (bp instanceof InstantiationAwareBeanPostProcessor) {
               InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
               //                  
               PropertyValues pvsToUse = ibp.postProcessProperties(pvs, bw.getWrappedInstance(), beanName);
               if (pvsToUse == null) {
                  if (filteredPds == null) {
                     filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
                  }
                  pvsToUse = ibp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);
                  if (pvsToUse == null) {
                     return;
                  }
               }
               pvs = pvsToUse;
            }
         }
      }
      if (needsDepCheck) {
         if (filteredPds == null) {
            filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
         }
         checkDependencies(beanName, mbd, filteredPds, pvs);
      }

      //       bean 
      if (pvs != null) {
         applyPropertyValues(beanName, mbd, bw, pvs);
      }
   }    
   

initializeBean    bean
    // AbstractAutowireCapableBeanFactory#initializeBean
   protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {
      if (System.getSecurityManager() != null) {
         AccessController.doPrivileged((PrivilegedAction) () -> {
            invokeAwareMethods(beanName, bean);
            return null;
         }, getAccessControlContext());
      }
      else {
         //     bean  ,Aware、BeanClassLoaderAware、BeanFactoryAware
         invokeAwareMethods(beanName, bean);
      }

      Object wrappedBean = bean;
      if (mbd == null || !mbd.isSynthetic()) {
         //            
         wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
      }

      try {
         //         init  
         invokeInitMethods(beanName, wrappedBean, mbd);
      }
      catch (Throwable ex) {
         throw new BeanCreationException(
               (mbd != null ? mbd.getResourceDescription() : null),
               beanName, "Invocation of init method failed", ex);
      }
      if (mbd == null || !mbd.isSynthetic()) {
         //            
         wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
      }

      return wrappedBean;
   }  
  

  DisposableBean
    // AbstractBeanFactory#registerDisposableBeanIfNecessary
   protected void registerDisposableBeanIfNecessary(String beanName, Object bean, RootBeanDefinition mbd) {
      AccessControlContext acc = (System.getSecurityManager() != null ? getAccessControlContext() : null);
      if (!mbd.isPrototype() && requiresDestruction(bean, mbd)) {
         if (mbd.isSingleton()) {
            // Register a DisposableBean implementation that performs all destruction
            // work for the given bean: DestructionAwareBeanPostProcessors,
            // DisposableBean interface, custom destroy method.
            //             bean,         DisposableBean bean,
            //       bean  DestructionAwareBeanPostProcessor  DisposableBean,
            registerDisposableBean(beanName,
                  new DisposableBeanAdapter(bean, beanName, mbd, getBeanPostProcessors(), acc));
         }
         else {
            // A bean with a custom scope...
            //    scope   
            Scope scope = this.scopes.get(mbd.getScope());
            if (scope == null) {
               throw new IllegalStateException("No Scope registered for scope name '" + mbd.getScope() + "'");
            }
            scope.registerDestructionCallback(beanName,
                  new DisposableBeanAdapter(bean, beanName, mbd, getBeanPostProcessors(), acc));
         }
      }
   }  
 
 
以上は個人的な理解です.問題があれば指摘してください.ありがとうございます.