spring-doCreateBean

protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args)
           throws BeanCreationException {
 
       // Instantiate the bean.
       BeanWrapper instanceWrapper = null;
       if (mbd.isSingleton()) {
           instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
       }
 
       // 创建bean实例
       // 1、 如果定义了工厂方法,则用工厂方法方法创建实例
       //    注意,此处的工厂bean指的是配置了factory-bean/factory-method属性的bean,不是实现了FacrotyBean接口的bean。
       //    如果没有配置factory-bean属性,那么factory-method指向的方法必须是静态的。
       // 2、通过构造器创建bean实例
       //    获取正确的构造器, 调用SmartInstantiationAwareBeanPostProcessor.determineCandidateConstructors方法,
       //    实际是 AutowiredAnnotationBeanPostProcessor.determineCandidateConstructors方法:
       //      1)如果构造器上面有@Autowire或@Value注解
       //      2)如果只有一个构造函数,且不是默认的构造函数
       // 3、使用无参的默认构造函数:  BeanUtils.instantiateClass(constructorToUse);
       if (instanceWrapper == null) {
           instanceWrapper = createBeanInstance(beanName, mbd, args);
       }
       final Object bean = (instanceWrapper != null ? instanceWrapper.getWrappedInstance() : null);
       Class beanType = (instanceWrapper != null ? instanceWrapper.getWrappedClass() : null);
       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));
       if (earlySingletonExposure) {
           if (logger.isDebugEnabled()) {
               logger.debug("Eagerly caching bean '" + beanName +
                       "' to allow for resolving potential circular references");
           }
           addSingletonFactory(beanName, new ObjectFactory() {
               @Override
               public Object getObject() throws BeansException {
                   return getEarlyBeanReference(beanName, mbd, bean);
               }
           });
       }
 
       // Initialize the bean instance.
       Object exposedObject = bean;
       try {
           // autowire的实现, autowireByName, autowireByType
           // @Autowire注解的实现, AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues
           populateBean(beanName, mbd, instanceWrapper);
           if (exposedObject != null) {
               // 初始化
               // 1) 调用Aware接口
               // 2) 执行postProcessBeforeInitialization.postProcessBeforeInitialization
               // 3) 调用init方法
               //      调用InitializingBean.afterPropertiesSet方法
               //      调用自定义的init-method
               // 4) 执行postProcessBeforeInitialization.postProcessAfterInitialization
               exposedObject = initializeBean(beanName, exposedObject, mbd);
           }
       }
       catch (Throwable ex) {
           if (ex instanceof BeanCreationException && beanName.equals(((BeanCreationException) ex).getBeanName())) {
               throw (BeanCreationException) ex;
           }
           else {
               throw new BeanCreationException(
                       mbd.getResourceDescription(), beanName, "Initialization of bean failed", ex);
           }
       }
 
       if (earlySingletonExposure) {
           Object earlySingletonReference = getSingleton(beanName, false);
           if (earlySingletonReference != null) {
               if (exposedObject == bean) {
                   exposedObject = earlySingletonReference;
               }
               else if (!this.allowRawInjectionDespiteWrapping && hasDependentBean(beanName)) {
                   String[] dependentBeans = getDependentBeans(beanName);
                   Set 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 {
           registerDisposableBeanIfNecessary(beanName, bean, mbd);
       }
       catch (BeanDefinitionValidationException ex) {
           throw new BeanCreationException(
                   mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);
       }
 
       return exposedObject;
   }

 

你可能感兴趣的:(spring,java)