spring bean的生命周期和创建流程
一、從composeScan注解中掃描到新類或者@BEAN中得到新類,并將beanDefinner注冊到容器工廠中。
二、在refreshContext中會創建實例。AbstractAutowireCapableBeanFactory.doCreateBean方法中。
protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)throws BeanCreationException {// Instantiate the bean.BeanWrapper instanceWrapper = null;if (mbd.isSingleton()) {instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);}if (instanceWrapper == null) {instanceWrapper = createBeanInstance(beanName, mbd, args);}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 {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.isTraceEnabled()) {logger.trace("Eagerly caching bean '" + beanName +"' to allow for resolving potential circular references");}addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));}// Initialize the bean instance.Object exposedObject = bean;try {populateBean(beanName, mbd, instanceWrapper);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<String> 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 [" );}}}}// Register bean as disposable.try {registerDisposableBeanIfNecessary(beanName, bean, mbd);}catch (BeanDefinitionValidationException ex) {throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);}return exposedObject;}? ? ? ?1.創建實例對象 。instanceWrapper = createBeanInstance(beanName, mbd, args);,實際上是通過反射創建實例對象,這里的對象,接口是java動態代理,類是cglib動態代理。
? ? ? ?2.調用容器中所有實現了MergedBeanDefinitionPostProcessor的接口,進行BEAN的字段屬性合并。在這里主要是作了@resource,@autowired的屬性合并到beandefinner對象 。
protected void applyMergedBeanDefinitionPostProcessors(RootBeanDefinition mbd, Class<?> beanType, String beanName) {for (BeanPostProcessor bp : getBeanPostProcessors()) {if (bp instanceof MergedBeanDefinitionPostProcessor) {MergedBeanDefinitionPostProcessor bdp = (MergedBeanDefinitionPostProcessor) bp;bdp.postProcessMergedBeanDefinition(mbd, beanType, beanName);}}}? ? ? ?3.將beandefinner對象的屬性數據填充到實例對象的屬性字段 調用populateBean(beanName, mbd, instanceWrapper);實際上是通過反射調用屬性字段的修改。
? ? ? 4.調用initializeBean進行填充屬性后的初始化操作。
? ? ? ?4.1 首先會調用AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization,對容器中所有實現了BeanPostProcessor接口進行before回調,
public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)throws BeansException {Object result = existingBean;for (BeanPostProcessor processor : getBeanPostProcessors()) {Object current = processor.postProcessBeforeInitialization(result, beanName);if (current == null) {return result;}result = current;}return result;}? ? 4.2 如果此對象實現了InitializingBean,則會調用afterPropertiesSet方法。
? ? 4.3 如果此對象自定義了初始化方法,也會觸發。
? ?4.4調用AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization
,對容器中所有實現了BeanPostProcessor接口進行after回調,
總結
以上是生活随笔為你收集整理的spring bean的生命周期和创建流程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: springboot 的启动流程
- 下一篇: spring5 配置log系统MAVEN