澄澈的眼|这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);}}通过源码实现可以看出「自动装配」与「注解注入」的处理是有差别的 。 其中自动装配时通过属性判断来完成 。 注解注入是通过「后置处理器」来完成的 。
推荐阅读
- 科技资讯眺望|Boot 12 国际化,Spring
- 澄澈的眼|余承东成背后主要“推手”,错在华为?华为手机涨价的原因曝光
- spring|某Java程序员在外包公司每天读写删改几年后,发现跳不出来了
- 澄澈的眼|的那些事(二),关于国密HTTPS
- mybatis|java新手教程: springboot集成mybatis-plus上篇的学习
- 芯片|成功突破离子注入关键技术,率先开发铌酸锂薄膜芯,厉害了我的国
- 澄澈的眼|自学一个月跳槽计算机视觉,其实入门很简单,网友:Java岗
- 管掌柜|管掌柜平台为长沙管道交易行业注入新动能
- spring|SpringBoot使用起来太简单了,真香!
- 澄澈的眼|余承东正式宣布,联想也没想到发展这么快,4年做到中国电脑第二