我们同样以TransactionServiceTest为例:@ServicepublicclassTransactionServiceTest{@AutowiredprivateIQrcodeAdScheduleServiceqrcodeAdScheduleService;}图1图2从图1和图2可以看出SpringBoot在执行beanFactory.preInstantiateSingletons()方法的过程中,需要实例化目标bean(TransactionServiceTest);图3其中AbstractAutowireCapableBeanFactory.populateBean():if(hasInstAwareBpps){for(BeanPostProcessorbp:getBeanPostProcessors()){if(bpinstanceofInstantiationAwareBeanPostProcessor){Instantiation=AwareBeanPostProcessor(InstantiationAwareBeanPostProcessor)bp;//调用AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues()方法;pvs=ibp.postProcessPropertyValues(pvs,filteredPds,bw.getWrappedInstance(),beanName);如果(pvs==null){返回;}在图4中,我们了解到上面的逻辑其实是通过AutowiredAnnotationBeanPostProcessor.inject()方法->DefaultListableBeanFactory.resolveDependency()来实例化受@Autowired影响的属性bean(即qrcodeAdScheduleService);图3和图4可以看到原来这个AutowiredAnnotationBeanPostProcessor是专门用来处理@Autowired的图5图6图5,图6看到经过AutowiredAnnotationBeanPostProcessor处理后,再实例化属性bean(即qrcodeAdScheduleService)受@Autowired影响!那么问题来了,AutowiredAnnotationBeanPostProcessor是如何识别@Autowired属性信息的呢?我们往下看:图4图4可以清楚的看到调用栈信息。也就是说,这个applyMergedBeanDefinitionPostProcessors()是解析@Autowired和存储的入口点//允许后处理器修改合并的bean定义。synchronized(mbd.postProcessingLock){if(!mbd.postProcessed){try{//postProcessor修改BeanDefinition结构applyMergedBeanDefinitionPostProcessors(mbd,beanType,beanName);}catch(Throwableex){thrownewBeanCreationException(mbd.getResourceDescription(),beanName,“合并bean定义后处理失败”,ex);}姆巴达。后处理=真;}}对于AutowiredAnnotationBeanPostProcessor,查找目标bean中的@Autowired注解信息:publicvoidpostProcessMergedBeanDefinition(RootBeanDefinitionbeanDefinition,Class>beanType,StringbeanName){//解析@AutowiredInjectionMetadatametadata=findAutowiringMetadata(beanN)ame,beanType,null);metadata.checkConfigMembers(beanDefinition);最初,在AutowiredAnnotationBeanPostProcessor的构造函数中:publicAutowiredAnnotationBeanPostProcessor(){this.autowiredAnnotationTypes.add(Autowired.class);this.autowiredAnnotationTypes.add(Value.class);尝试{this.autowiredAnnotationTypes.add((Class)ClassUtils.forName("javax.inject.Inject",AutowiredAnnotationBeanPostProcessor.class.getClassLoader()));logger.info("发现JSR-330'javax.inject.Inject'注释并支持自动装配");}catch(ClassNotFoundExceptionex){//JSR-330API不可用-只需跳过。}}autowiredAnnotationTypes集合保存了Autowired.class、Value.class等信息;然后通过findAutowiredAnnotation()解析、匹配、保存//ao,也就是我们通过反射获取Field信息privateAnnotationAttributesfindAutowiredAnnotation(AccessibleObjectao){if(ao.getAnnotations().length>0){//遍历AutowiredAnnotationBeanPostProcessor.autowiredAnnotationTypes中保存的注解信息for(Classtype:this.autowiredAnnotationTypes){AnnotationAttributesattributes=AnnotatedElementUtils.getMergedAnnotationAttributes(ao,type);//如果匹配,则返回if(attributes!=null){returnattributes;}}}返回空值;}@Autowired的相关信息已经通过上面的方法获取并保存好了,最后在doCreateBean()中populateBean(beanName,mbd,instanceWrapper)实例化了受@Autowired影响的bean!
