SpringBean生命周期
SpringBean生命周期的四个阶段
实例化:createBeanInstance(beanName, mbd, args)
属性赋值:populateBean(beanName, mbd, instanceWrapper)
初始化:initializeBean(beanName, exposedObject, mbd)
销毁:如果 Bean 实现了 DisposableBean 接口,则 Spring 会调用 destory() 方法将 Spring 中的 Bean 销毁;如果在配置文件中通过 destory-method 属性指定了 Bean 的销毁方法,则 Spring 将调用该方法对 Bean 进行销毁。
doCreateBean方法源码 在SpringBean源码中的doCreateBean方法中能有体现,该方法依次调用createBeanInstance、populateBean、initializeBean方法
protected Object doCreateBean (String beanName, RootBeanDefinition mbd, @Nullable Object[] args) throws BeanCreationException { BeanWrapper instanceWrapper = null ; if (mbd.isSingleton()) { instanceWrapper = (BeanWrapper)this .factoryBeanInstanceCache.remove(beanName); } if (instanceWrapper == null ) { instanceWrapper = this .createBeanInstance(beanName, mbd, args); } Object bean = instanceWrapper.getWrappedInstance(); Class<?> beanType = instanceWrapper.getWrappedClass(); if (beanType != NullBean.class) { mbd.resolvedTargetType = beanType; } synchronized (mbd.postProcessingLock) { if (!mbd.postProcessed) { try { this .applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName); } catch (Throwable var17) { throw new BeanCreationException (mbd.getResourceDescription(), beanName, "Post-processing of merged bean definition failed" , var17); } mbd.postProcessed = true ; } } boolean earlySingletonExposure = mbd.isSingleton() && this .allowCircularReferences && this .isSingletonCurrentlyInCreation(beanName); if (earlySingletonExposure) { if (this .logger.isTraceEnabled()) { this .logger.trace("Eagerly caching bean '" + beanName + "' to allow for resolving potential circular references" ); } this .addSingletonFactory(beanName, () -> { return this .getEarlyBeanReference(beanName, mbd, bean); }); } Object exposedObject = bean; try { this .populateBean(beanName, mbd, instanceWrapper); exposedObject = this .initializeBean(beanName, exposedObject, mbd); } catch (Throwable var18) { if (var18 instanceof BeanCreationException && beanName.equals(((BeanCreationException)var18).getBeanName())) { throw (BeanCreationException)var18; } throw new BeanCreationException (mbd.getResourceDescription(), beanName, "Initialization of bean failed" , var18); } if (earlySingletonExposure) { Object earlySingletonReference = this .getSingleton(beanName, false ); 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); } } 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 { this .registerDisposableBeanIfNecessary(beanName, bean, mbd); return exposedObject; } catch (BeanDefinitionValidationException var16) { throw new BeanCreationException (mbd.getResourceDescription(), beanName, "Invalid destruction signature" , var16); } }
doCreateBean方法位于SpringBean源码的AbstractAutowireCapableBeanFactory方法中,具体位置如下,有兴趣的可以进行更深一步了解
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory