bean的建立過程--doCreateBean
阿新 • • 發佈:2020-09-23
createBean原始碼分析
protected Object createBean(String beanName, RootBeanDefinition mbd, Object[] args) throws BeanCreationException { if (this.logger.isDebugEnabled()) { this.logger.debug("Creating instance of bean '" + beanName + "'"); } //鎖定class, 根據設定的class屬性或者根據className來解析class this.resolveBeanClass(mbd, beanName, new Class[0]); //驗證及準備覆蓋的方法 try { mbd.prepareMethodOverrides(); } catch (BeanDefinitionValidationException var5) { throw new BeanDefinitionStoreException(mbd.getResourceDescription(), beanName, "Validation of method overrides failed", var5); } Object beanInstance;try { //BeanPostProcessors來返回代理替代真正的例項 beanInstance = this.resolveBeforeInstantiation(beanName, mbd); if (beanInstance != null) { return beanInstance; } } catch (Throwable var6) { throw new BeanCreationException(mbd.getResourceDescription(), beanName, "BeanPostProcessor before instantiation of bean failed", var6); } beanInstance= this.doCreateBean(beanName, mbd, args); if (this.logger.isDebugEnabled()) { this.logger.debug("Finished creating instance of bean '" + beanName + "'"); } return beanInstance; }
接著分析doCreateBean
protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, Object[] args) { BeanWrapper instanceWrapper = null; if (mbd.isSingleton()) { instanceWrapper = (BeanWrapper)this.factoryBeanInstanceCache.remove(beanName); } if (instanceWrapper == null) { //根據指定bean使用對應的策略建立新的例項, instanceWrapper = this.createBeanInstance(beanName, mbd, args); } final Object bean = instanceWrapper != null ? instanceWrapper.getWrappedInstance() : null; Class<?> beanType = instanceWrapper != null ? instanceWrapper.getWrappedClass() : null; synchronized(mbd.postProcessingLock) { if (!mbd.postProcessed) { this.applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName); mbd.postProcessed = true; } } //是否需要提早曝光:單例&允許迴圈依賴&當前bean正在建立中,檢測迴圈依賴 boolean earlySingletonExposure = mbd.isSingleton() && this.allowCircularReferences && this.isSingletonCurrentlyInCreation(beanName); if (earlySingletonExposure) { if (this.logger.isDebugEnabled()) { this.logger.debug("Eagerly caching bean '" + beanName + "' to allow for resolving potential circular references"); } //為避免迴圈依賴,在bean初始化前將建立例項的ObjectFactory加入工廠 this.addSingletonFactory(beanName, new ObjectFactory<Object>() { public Object getObject() throws BeansException { return AbstractAutowireCapableBeanFactory.this.getEarlyBeanReference(beanName, mbd, bean); } }); } Object exposedObject = bean; try { //對bean進行填充,將各個屬性值注入,其中,可能存在依賴於其他bean的屬性,則會遞迴初始依賴bean this.populateBean(beanName, mbd, instanceWrapper); if (exposedObject != null) { //呼叫初始化方法,比如init-method exposedObject = this.initializeBean(beanName, exposedObject, mbd); } } catch (Throwable var17) { if (var17 instanceof BeanCreationException && beanName.equals(((BeanCreationException)var17).getBeanName())) { throw (BeanCreationException)var17; } throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Initialization of bean failed", var17); } if (earlySingletonExposure) { Object earlySingletonReference = this.getSingleton(beanName, false); //earlySingletonReference只有在檢測到迴圈依賴的情況下才不為空 if (earlySingletonReference != null) { if (exposedObject == bean) { exposedObject = earlySingletonReference; } else if (!this.allowRawInjectionDespiteWrapping && this.hasDependentBean(beanName)) { String[] dependentBeans = this.getDependentBeans(beanName); Set<String> actualDependentBeans = new LinkedHashSet(dependentBeans.length); String[] var12 = dependentBeans; int var13 = dependentBeans.length; //檢測依賴 for(int var14 = 0; var14 < var13; ++var14) { String dependentBean = var12[var14]; if (!this.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."); } } } } try { //檢測scope註冊bean this.registerDisposableBeanIfNecessary(beanName, bean, mbd); return exposedObject; } catch (BeanDefinitionValidationException var16) { throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Invalid destruction signature", var16); } }
簡述doCreateBean:
1:如果是單例則需要首先清楚快取
2:例項化bean,將BeanDefinition轉換為BeanWrapper
3:MergedBeanDefinitionPostProcessor的應用
4:依賴處理
5:屬性填充
6:迴圈依賴檢查
7:註冊DisposableBean
8:完成建立並返回