你的位置:首页 > 软件开发 > Java > 【Spring源码分析】非懒加载的Bean实例化过程(下篇)

【Spring源码分析】非懒加载的Bean实例化过程(下篇)

发布时间:2017-02-05 00:00:26
doCreateBean方法上文【Spring源码分析】非懒加载的Bean实例化过程(上篇),分析了单例的Bean初始化流程,并跟踪代码进入了主流程,看到了Bean是如何被实例化出来的。先贴一下AbstractAutowireCapableBeanFactory的doCreate ...

【Spring源码分析】非懒加载的Bean实例化过程(下篇)

doCreateBean方法

上文【Spring源码分析】非懒加载的Bean实例化过程(上篇),分析了单例的Bean初始化流程,并跟踪代码进入了主流程,看到了Bean是如何被实例化出来的。先贴一下AbstractAutowireCapableBeanFactory的doCreateBean方法代码:

 1 protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args) { 2   // Instantiate the bean. 3   BeanWrapper instanceWrapper = null; 4   if (mbd.isSingleton()) { 5     instanceWrapper = this.factoryBeanInstanceCache.remove(beanName); 6   } 7   if (instanceWrapper == null) { 8     instanceWrapper = createBeanInstance(beanName, mbd, args); 9   }10   final Object bean = (instanceWrapper != null ? instanceWrapper.getWrappedInstance() : null);11   Class beanType = (instanceWrapper != null ? instanceWrapper.getWrappedClass() : null);12 13   // Allow post-processors to modify the merged bean definition.14   synchronized (mbd.postProcessingLock) {15     if (!mbd.postProcessed) {16       applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);17       mbd.postProcessed = true;18     }19   }20 21   // Eagerly cache singletons to be able to resolve circular references22   // even when triggered by lifecycle interfaces like BeanFactoryAware.23   boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&24       isSingletonCurrentlyInCreation(beanName));25   if (earlySingletonExposure) {26     if (logger.isDebugEnabled()) {27       logger.debug("Eagerly caching bean '" + beanName +28           "' to allow for resolving potential circular references");29     }30     addSingletonFactory(beanName, new ObjectFactory() {31       public Object getObject() throws BeansException {32         return getEarlyBeanReference(beanName, mbd, bean);33       }34     });35   }36 37   // Initialize the bean instance.38   Object exposedObject = bean;39   try {40     populateBean(beanName, mbd, instanceWrapper);41     if (exposedObject != null) {42       exposedObject = initializeBean(beanName, exposedObject, mbd);43     }44   }45   catch (Throwable ex) {46     if (ex instanceof BeanCreationException && beanName.equals(((BeanCreationException) ex).getBeanName())) {47       throw (BeanCreationException) ex;48     }49     else {50       throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Initialization of bean failed", ex);51     }52   }53 54   if (earlySingletonExposure) {55     Object earlySingletonReference = getSingleton(beanName, false);56     if (earlySingletonReference != null) {57       if (exposedObject == bean) {58         exposedObject = earlySingletonReference;59       }60       else if (!this.allowRawInjectionDespiteWrapping && hasDependentBean(beanName)) {61         String[] dependentBeans = getDependentBeans(beanName);62         Set<String> actualDependentBeans = new LinkedHashSet<String>(dependentBeans.length);63         for (String dependentBean : dependentBeans) {64           if (!removeSingletonIfCreatedForTypeCheckOnly(dependentBean)) {65             actualDependentBeans.add(dependentBean);66           }67         }68         if (!actualDependentBeans.isEmpty()) {69           throw new BeanCurrentlyInCreationException(beanName,70               "Bean with name '" + beanName + "' has been injected into other beans [" +71               StringUtils.collectionToCommaDelimitedString(actualDependentBeans) +72               "] in its raw version as part of a circular reference, but has eventually been " +73               "wrapped. This means that said other beans do not use the final version of the " +74               "bean. This is often the result of over-eager type matching - consider using " +75               "'getBeanNamesOfType' with the 'allowEagerInit' flag turned off, for example.");76         }77       }78     }79   }80 81   // Register bean as disposable.82   try {83     registerDisposableBeanIfNecessary(beanName, bean, mbd);84   }85   catch (BeanDefinitionValidationException ex) {86     throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);87   }88 89   return exposedObject;90 }

原标题:【Spring源码分析】非懒加载的Bean实例化过程(下篇)

关键词:Spring

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录