publicObjectinstantiate(RootBeanDefinitionbd,StringbeanName,BeanFactoryowner){// Don't override the class with CGLIB if no overrides.
if(bd.getMethodOverrides().isEmpty()){Constructor<?>constructorToUse;synchronized(bd.constructorArgumentLock){//获取构造方法或者工厂方法
constructorToUse=(Constructor<?>)bd.resolvedConstructorOrFactoryMethod;if(constructorToUse==null){finalClass<?>clazz=bd.getBeanClass();if(clazz.isInterface()){thrownewBeanInstantiationException(clazz,"Specified class is an interface");}try{if(System.getSecurityManager()!=null){constructorToUse=AccessController.doPrivileged(newPrivilegedExceptionAction<Constructor<?>>(){@OverridepublicConstructor<?>run()throwsException{returnclazz.getDeclaredConstructor((Class[])null);}});}else{constructorToUse=clazz.getDeclaredConstructor((Class[])null);}bd.resolvedConstructorOrFactoryMethod=constructorToUse;}catch(Throwableex){thrownewBeanInstantiationException(clazz,"No default constructor found",ex);}}}//使用BeanUtils实例化,里面调用的是构造方法实例化
returnBeanUtils.instantiateClass(constructorToUse);}else{//CglibSubclassingInstantiationStrategy重写了该方法,使用cglib实例化
returninstantiateWithMethodInjection(bd,beanName,owner);}}
protectedvoidapplyPropertyValues(StringbeanName,BeanDefinitionmbd,BeanWrapperbw,PropertyValuespvs){if(pvs==null||pvs.isEmpty()){return;}MutablePropertyValuesmpvs=null;List<PropertyValue>original;if(System.getSecurityManager()!=null){if(bwinstanceofBeanWrapperImpl){((BeanWrapperImpl)bw).setSecurityContext(getAccessControlContext());}}if(pvsinstanceofMutablePropertyValues){mpvs=(MutablePropertyValues)pvs;if(mpvs.isConverted()){// Shortcut: use the pre-converted values as-is.
try{bw.setPropertyValues(mpvs);return;}catch(BeansExceptionex){thrownewBeanCreationException(mbd.getResourceDescription(),beanName,"Error setting property values",ex);}}original=mpvs.getPropertyValueList();}else{original=Arrays.asList(pvs.getPropertyValues());}//自定义类型转换器
TypeConverterconverter=getCustomTypeConverter();if(converter==null){converter=bw;}BeanDefinitionValueResolvervalueResolver=newBeanDefinitionValueResolver(this,beanName,mbd,converter);//创建副本用于转换及注入到Bean中
List<PropertyValue>deepCopy=newArrayList<PropertyValue>(original.size());booleanresolveNecessary=false;for(PropertyValuepv:original){if(pv.isConverted()){deepCopy.add(pv);}else{StringpropertyName=pv.getName();ObjectoriginalValue=pv.getValue();//通过属性获取值,并处理依赖关系
ObjectresolvedValue=valueResolver.resolveValueIfNecessary(pv,originalValue);ObjectconvertedValue=resolvedValue;booleanconvertible=bw.isWritableProperty(propertyName)&&!PropertyAccessorUtils.isNestedOrIndexedProperty(propertyName);if(convertible){convertedValue=convertForProperty(resolvedValue,propertyName,bw,converter);}// Possibly store converted value in merged bean definition,
// in order to avoid re-conversion for every created bean instance.
if(resolvedValue==originalValue){if(convertible){pv.setConvertedValue(convertedValue);}deepCopy.add(pv);}elseif(convertible&&originalValueinstanceofTypedStringValue&&!((TypedStringValue)originalValue).isDynamic()&&!(convertedValueinstanceofCollection||ObjectUtils.isArray(convertedValue))){pv.setConvertedValue(convertedValue);deepCopy.add(pv);}else{resolveNecessary=true;deepCopy.add(newPropertyValue(pv,convertedValue));}}}if(mpvs!=null&&!resolveNecessary){mpvs.setConverted();}// 参数注入的地方
try{bw.setPropertyValues(newMutablePropertyValues(deepCopy));}catch(BeansExceptionex){thrownewBeanCreationException(mbd.getResourceDescription(),beanName,"Error setting property values",ex);}}
publicObjectresolveValueIfNecessary(ObjectargName,Objectvalue){//如果该Bean被其它对象依赖时
if(valueinstanceofRuntimeBeanReference){RuntimeBeanReferenceref=(RuntimeBeanReference)value;returnresolveReference(argName,ref);}elseif(valueinstanceofRuntimeBeanNameReference){//省略源码
}elseif(valueinstanceofBeanDefinitionHolder){// Resolve BeanDefinitionHolder: contains BeanDefinition with name and aliases.
BeanDefinitionHolderbdHolder=(BeanDefinitionHolder)value;returnresolveInnerBean(argName,bdHolder.getBeanName(),bdHolder.getBeanDefinition());}elseif(valueinstanceofBeanDefinition){//省略源码
returnresolveInnerBean(argName,innerBeanName,bd);}elseif(valueinstanceofManagedArray){//省略源码
returnresolveManagedArray(argName,(List<?>)value,elementType);}elseif(valueinstanceofManagedList){// May need to resolve contained runtime references.
returnresolveManagedList(argName,(List<?>)value);}elseif(valueinstanceofManagedSet){// May need to resolve contained runtime references.
returnresolveManagedSet(argName,(Set<?>)value);}elseif(valueinstanceofManagedMap){// May need to resolve contained runtime references.
returnresolveManagedMap(argName,(Map<?,?>)value);}elseif(valueinstanceofManagedProperties){//省略源码
returncopy;}elseif(valueinstanceofTypedStringValue){//省略源码
}else{returnevaluate(value);}}privateObjectresolveInnerBean(ObjectargName,StringinnerBeanName,BeanDefinitioninnerBd){RootBeanDefinitionmbd=null;try{mbd=this.beanFactory.getMergedBeanDefinition(innerBeanName,innerBd,this.beanDefinition);// Check given bean name whether it is unique. If not already unique,
// add counter - increasing the counter until the name is unique.
StringactualInnerBeanName=innerBeanName;if(mbd.isSingleton()){actualInnerBeanName=adaptInnerBeanName(innerBeanName);}this.beanFactory.registerContainedBean(actualInnerBeanName,this.beanName);// 确保依赖的Bean已经被实例化
String[]dependsOn=mbd.getDependsOn();if(dependsOn!=null){// 获取依赖的Bean,如果没有被创建该方法会自动创建
for(StringdependsOnBean:dependsOn){this.beanFactory.registerDependentBean(dependsOnBean,actualInnerBeanName);this.beanFactory.getBean(dependsOnBean);}}//开始实例化Bean
ObjectinnerBean=this.beanFactory.createBean(actualInnerBeanName,mbd,null);if(innerBeaninstanceofFactoryBean){booleansynthetic=mbd.isSynthetic();returnthis.beanFactory.getObjectFromFactoryBean((FactoryBean<?>)innerBean,actualInnerBeanName,!synthetic);}else{returninnerBean;}}catch(BeansExceptionex){thrownewBeanCreationException(this.beanDefinition.getResourceDescription(),this.beanName,"Cannot create inner bean '"+innerBeanName+"' "+(mbd!=null&&mbd.getBeanClassName()!=null?"of type ["+mbd.getBeanClassName()+"] ":"")+"while setting "+argName,ex);}}
//如果是list类型
if(propValueinstanceofList){PropertyHandlerph=getPropertyHandler(actualName);Class<?>requiredType=ph.getCollectionType(tokens.keys.length);List<Object>list=(List<Object>)propValue;intindex=Integer.parseInt(key);ObjectoldValue=null;if(isExtractOldValueForEditor()&&index<list.size()){oldValue=list.get(index);}//如果有对应参数转换器则将原值转换
ObjectconvertedValue=convertIfNecessary(propertyName,oldValue,pv.getValue(),requiredType,ph.nested(tokens.keys.length));intsize=list.size();if(index>=size&&index<this.autoGrowCollectionLimit){for(inti=size;i<index;i++){try{list.add(null);}catch(NullPointerExceptionex){thrownewInvalidPropertyException(getRootClass(),this.nestedPath+propertyName,"Cannot set element with index "+index+" in List of size "+size+", accessed using property path '"+propertyName+"': List does not support filling up gaps with null elements");}}//如果超出原有长度,则新增数据
list.add(convertedValue);}else{//替换原有值
try{list.set(index,convertedValue);}catch(IndexOutOfBoundsExceptionex){thrownewInvalidPropertyException(getRootClass(),this.nestedPath+propertyName,"Invalid list index in property path '"+propertyName+"'",ex);}}}