澄澈的眼|这Spring注入对象处理过程也太细了,收藏了,什么神仙( 二 )


protectedvoidpopulateBean(StringbeanName,RootBeanDefinitionmbd,@NullableBeanWrapperbw){if(bw==null){if(mbd.hasPropertyValues()){thrownewBeanCreationException(mbd.getResourceDescription(),beanName,"Cannotapplypropertyvaluestonullinstance");}else{//Skippropertypopulationphasefornullinstance.//没有任何属性需要填充return;}}if(!mbd.isSynthetic()&&hasInstantiationAwareBeanPostProcessors()){for(BeanPostProcessorbp:getBeanPostProcessors()){if(bpinstanceofInstantiationAwareBeanPostProcessor){InstantiationAwareBeanPostProcessoribp=(InstantiationAwareBeanPostProcessor)bp;/***InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation()方法的应用*可以控制程序是否进行属性填充*/if(!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(),beanName)){return;}}}}/***取得BeanDefinition中设置的Property值 , *这些property来自对BeanDefinition的解析 , *具体的过程可以参看对载入个解析BeanDefinition的分析*这里是Spring内部设置的属性值 , 一般不会设置*/PropertyValuespvs=(mbd.hasPropertyValues()?mbd.getPropertyValues():null);/***处理自动装配 , xml的方式可能会有配置自动装配类型的情况*或者通过setAutowireMode()的方式设置自动装配的模式*/intresolvedAutowireMode=mbd.getResolvedAutowireMode();//Spring默认既不是byType也不是byName,默认是null//这里之所以做这个判断是因为某种特殊的场景下 , 会修改到自动注入的模型 , 所以需要做判断if(resolvedAutowireMode==AUTOWIRE_BY_NAME||resolvedAutowireMode==AUTOWIRE_BY_TYPE){MutablePropertyValuesnewPvs=newMutablePropertyValues(pvs);/***byName处理*通过反射从当前Bean中得到需要注入的属性名 , *然后使用这个属性名向容器申请与之同名的Bean , *这样实际又触发了另一个Bean生成和依赖注入的过程*/if(resolvedAutowireMode==AUTOWIRE_BY_NAME){autowireByName(beanName,mbd,bw,newPvs);}//byType处理if(resolvedAutowireMode==AUTOWIRE_BY_TYPE){autowireByType(beanName,mbd,bw,newPvs);}pvs=newPvs;}//后置处理器已经初始化booleanhasInstAwareBpps=hasInstantiationAwareBeanPostProcessors();//需要检查依赖booleanneedsDepCheck=(mbd.getDependencyCheck()!=AbstractBeanDefinition.DEPENDENCY_CHECK_NONE);PropertyDescriptor[]filteredPds=null;if(hasInstAwareBpps){if(pvs==null){//与构造方法的处理一样 , 对象有但对象里面的属性没有pvs=mbd.getPropertyValues();}for(BeanPostProcessorbp:getBeanPostProcessors()){if(bpinstanceofInstantiationAwareBeanPostProcessor){InstantiationAwareBeanPostProcessoribp=(InstantiationAwareBeanPostProcessor)bp;//通过后置处理器来完成处理PropertyValuespvsToUse=ibp.postProcessProperties(pvs,bw.getWrappedInstance(),beanName);if(pvsToUse==null){if(filteredPds==null){filteredPds=filterPropertyDescriptorsForDependencyCheck(bw,mbd.allowCaching);}pvsToUse=ibp.postProcessPropertyValues(pvs,filteredPds,bw.getWrappedInstance(),beanName);if(pvsToUse==null){return;}}pvs=pvsToUse;}}}if(needsDepCheck){if(filteredPds==null){filteredPds=filterPropertyDescriptorsForDependencyCheck(bw,mbd.allowCaching);}checkDependencies(beanName,mbd,filteredPds,pvs);}if(pvs!=null){//对属性进行注入applyPropertyValues(beanName,mbd,bw,pvs);}}通过源码实现可以看出「自动装配」与「注解注入」的处理是有差别的 。 其中自动装配时通过属性判断来完成 。 注解注入是通过「后置处理器」来完成的 。


推荐阅读