seo排名优化公司哪家好,汕头百度seo在哪里,公司网站建设介绍,wordpress文章简介Autowired使用过程中遇到疑问#xff0c;通过源码解析原因 一、起因1、当person只有一个实现类时#xff0c;TestController中#xff0c;Person属性随意取名。2、当有Person两个实现类时#xff0c;TestController中#xff0c;属性名称必须和实现类名一致#xff08;ma… Autowired使用过程中遇到疑问通过源码解析原因 一、起因1、当person只有一个实现类时TestController中Person属性随意取名。2、当有Person两个实现类时TestController中属性名称必须和实现类名一致man或woman否则会报错。 二、Auowired调用过程# 1、目标类属性信息获取流程# 2、属性赋值流程三、Auowired解决问题的源码逻辑 一、起因
当前person接口有两个实现类man和woman。一个测试接口TestController。
1、当person只有一个实现类时TestController中Person属性随意取名。
2、当有Person两个实现类时TestController中属性名称必须和实现类名一致man或woman否则会报错。 二、Auowired调用过程
# 1、目标类属性信息获取流程
doCreateBean-applyMergedBeanDefinitionPostProcessors遍历执行postProcessMergedBeanDefinition方法其中AutowiredAnnotationBeanPostProcessor类符合条件执行findAutowiringMetadata方法然后buildAutowiringMetadata中使用反射获取目标类带有Autowired的属性信息封装成AutowiredFieldElement继承InjectionMetadata对象最后把目标类名为key属性信息为value存入injectionMetadataCache集合中。
# 2、属性赋值流程
doCreateBean-populateBean中循环执行InstantiationAwareBeanPostProcessor类型的后置处理器调用postProcessPropertyValues方法。AutowiredAnnotationBeanPostProcessor满足条件执行postProcessPropertyValues-findResourceMetadata,此方法获取目标类属性信息通过injectionMetadataCache集合返回InjectionMetadata类后执行InjectionMetadata中inject方法循环InjectedElement类型的目标类属性集合执行InjectedElement中inject方法根据属性信息从springIoc容器中获取目标属性最后使用反射给目标类赋值。
三、Auowired解决问题的源码逻辑
根据二步骤中AutowiredFieldElement.inject方法继续DefaultListableBeanFactory中resolveDependency方法调用doResolveDependency方法继续执行findAutowireCandidates。
String[] candidateNames BeanFactoryUtils.beanNamesForTypeIncludingAncestors(this, requiredType, true, descriptor.isEager());获取到了实现了所有person类的对象名称。**从参数requiredType可以看出Autowried是通过属性类型给属性赋值的。**最终返回MapString, Object 集合key为目标属性名称value为目标属性实体如果属性有多个实现类此集合中就会有多个key,value。
从下面图片可以看出判断matchingBeans目标属性是多个还是一个。多个会使用属性名称为key获取属性实体一个会默认获取这就解释了多实现时需要使用正确的属性名称单个实现时属性名称可以随意。