【知识库】--spring AbstractAutowireCapableBeanFactory 创建bean(240)

来源:互联网 发布:各大电商平台比价软件 编辑:程序博客网 时间:2024/05/17 06:29

写在前:

前面bean加载部分中,经过resolveBeforeInstantiation方法后,如果创建了代理(即重写了InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation方法并且在方法中改变了bean)直接返回即可,否则进行常规bean的创建。


常规的创建是在doCreateBean中完成的


protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args){    //Instantiate the bean    BeanWrapper instanceWrapper = null;    if(mbd.isSingleton()){instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);    }   if(instanceWrapper == null){           instanceWrapper = createBeanInstance(beanName,mbd,args);//使用对应的策略创建新的实例:工厂方法,构造函数自动注入,简单初始化   }   final Object bean = (instanceWrapper!=null?instanceWrapper.getWrapperInstance():null);   Class beanType = (instanceWrapper!=null?instanceWrapper.getWrapperClass():null);  //allow post-processors to modify the merged bean definition  synchronized  (mbd.postProcessingLock){         if(!mbd.postProcessed){  //使用MergedBeanDefinitionPostProcessor            applyMergedBeanDefinitionPostProcessors(mbd,beanType,beanName);            mbd.postProcessed = true;         }  }   //是否需要提前曝光:单例&允许循环依赖&bean正在创建   boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences && isSingletonCurrentlyInCreation(beanName));     if(earlySingletonExposure){        addSingletonFactory(beanName, new ObjectFactory(){public Object getObject() throws BeansException{          //对bean再一次依赖引用,主要应用SmartInstantiationAwareBeanPostProcessor,          //其中我们熟悉的AOP就是在这里将advice动态织入bean中,若没有直接返回bean.             return getEarlyBeanReference(beanName,mbd,bean);        }});   }  //Initialize the bean instance  Object exposedObject = bean;  try{        //对bean进行填充,将各个属性值注入,可能存在依赖于其他bean的属性,递归依赖bean     populateBean(beanName,mbd,instanceWrapper);     if(exposedObject !=null){//调用初始化方法 如 init-method            exposedObject = initializeBean(beanName,exposedObject,mbd);     }  }catch(Throwable 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<String>(dependentBeans.length);for(String dependentBean : dependentBeans){
//检测依赖if(!removeSingletonIfCreatedForTypeCheckOnly(dependentBean)){actualDependentBeans.add(dependentBean);}}//如果actualDependentBeans不为空表示当前bean创建后其依赖的bean却没有创建完,说明存在循环依赖if(!actualDependentBeans.isEmpty()){//抛出BeanCurrentlyInCreationException}}}  }  try{//注册为一次性可销毁的bean  registerDisposableBeanIfNecessary(beanName,bean,mbd);  }catch(){}return exposedObject;}













原创粉丝点击