首先创建一个测试用例:publicclassTransactionServiceTest{@ResourceprivateIQrcodeAdScheduleServiceqrcodeAdScheduleService;}然后启动SpringBoot可以看到如下调用栈信息:图1从上图可以看出,bean实例创建完成后,修改beanDefinition通过applyMergedBeanDefinitionPostProcessors()结构(对于这个场景,可以理解为解析@Resource对应的bean信息){如果(bpinstanceofMergedBeanDefinitionPostProcessor){MergedBeanDefinitionPostProcessorbdp=(MergedBeanDefinitionPostProcessor)bp;//执行CommonAnnotationBeanPostProcessor类postProcessMergedBeanDefinition()bdp.postProcessMergedBeanDefinition(mbd,beanType,beanName);下面看一下CommonAnnotationBeanPostProcessor的一些细节:privateInjectionMetadatabuildResourceMetadata(finalClassclazz){LinkedListelements=newLinkedList<>();类targetClass=clazz;做{finalLinkedListcurrElements=newLinkedList<>();ReflectionUtils.doWithLocalFields(targetClass,field->{if(webServiceRefClass!=null&&field.isAnnotationPresent(webServiceRefClass)){if(Modifier.isStatic(field.getModifiers())){thrownewIllegalStateException("不支持@WebServiceRef注解在静态字段上”);}currElements.add(newWebServiceRefElement(field,field,null));}elseif(ejbRefClass!=null&&field.isAnnotationPresent(ejbRefClass)){if(Modifier.isStatic(field.getModifiers())){thrownewIllegalStateException("静态字段不支持@EJB注解");}currElements.add(newEjbRefElement(field,field,null));}//解析@Resource.classelseif(field.isAnnotationPresent(Resource.class)){if(Modifier.isStatic(field.getModifiers())){thrownewIllegalStateException("@Resourceannotationisnotsupportedonstaticfields");}if(!ignoredResourceTypes.contains(field.getType().getName())){currElements.add(newResourceElement(field,field,null));}}});}上面的代码块有期待已久的“Resource.class”关键字,我们松了一口气。我们再回顾一下,流程是这样的:在AbstractAutowireCapableBeanFactory.populateBean()->ibp.postProcessPropertyValue()->CommonAnnotationBeanPostProcessor.postProcessPropertyValue()实例化@Resource作用的bean;除了它不是一个PostProcessor来处理@Autowired(使用“AutowiredAnnotationBeanPostProcessor”PostProcessor来处理@AutoWireds),其他处理流程和@Autowired完全一样!