| public Object resolveValueIfNecessary(Object argName, @Nullable Object value) {     // We must check each value to see whether it requires a runtime reference     // to another bean to be resolved.     // 5.1 解析引用     if (value instanceof RuntimeBeanReference) {         RuntimeBeanReference ref = (RuntimeBeanReference) value;         return resolveReference(argName, ref);     }     // 如果根据另一个Bean的name进行依赖,进入下面的分支     else if (value instanceof RuntimeBeanNameReference) {         String refName = ((RuntimeBeanNameReference) value).getBeanName();         refName = String.valueOf(doEvaluate(refName));         if (!this.beanFactory.containsBean(refName)) {             throw new BeanDefinitionStoreException(                     "Invalid bean name '" + refName + "' in bean reference for " + argName);         }         return refName;     }     // 解析BeanDefinitionHolder     else if (value instanceof BeanDefinitionHolder) {         // Resolve BeanDefinitionHolder: contains BeanDefinition with name and aliases.         BeanDefinitionHolder bdHolder = (BeanDefinitionHolder) value;         return resolveInnerBean(argName, bdHolder.getBeanName(), bdHolder.getBeanDefinition());     }     // 解析纯BeanDefinition     else if (value instanceof BeanDefinition) {         // Resolve plain BeanDefinition, without contained name: use dummy name.         BeanDefinition bd = (BeanDefinition) value;         String innerBeanName = "(inner bean)" + BeanFactoryUtils.GENERATED_BEAN_NAME_SEPARATOR +                 ObjectUtils.getIdentityHexString(bd);         return resolveInnerBean(argName, innerBeanName, bd);     }     // 解析数组     else if (value instanceof ManagedArray) {         // May need to resolve contained runtime references.         ManagedArray array = (ManagedArray) value;         Class<?> elementType = array.resolvedElementType;         if (elementType == null) {             String elementTypeName = array.getElementTypeName();             if (StringUtils.hasText(elementTypeName)) {                 try {                     elementType = ClassUtils.forName(elementTypeName, this.beanFactory.getBeanClassLoader());                     array.resolvedElementType = elementType;                 }                 catch (Throwable ex) {                     // Improve the message by showing the context.                     throw new BeanCreationException(                             this.beanDefinition.getResourceDescription(), this.beanName,                             "Error resolving array type for " + argName, ex);                 }             }             else {                 elementType = Object.class;             }         }         return resolveManagedArray(argName, (List<?>) value, elementType);     }     //5.2解析List     else if (value instanceof ManagedList) {         // May need to resolve contained runtime references.         return resolveManagedList(argName, (List<?>) value);     }     // 解析Set     else if (value instanceof ManagedSet) {         // May need to resolve contained runtime references.         return resolveManagedSet(argName, (Set<?>) value);     }     // 解析Map     else if (value instanceof ManagedMap) {         // May need to resolve contained runtime references.         return resolveManagedMap(argName, (Map<?, ?>) value);     }     // 解析Properties     else if (value instanceof ManagedProperties) {         Properties original = (Properties) value;         Properties copy = new Properties();         original.forEach((propKey, propValue) -> {             if (propKey instanceof TypedStringValue) {                 propKey = evaluate((TypedStringValue) propKey);             }             if (propValue instanceof TypedStringValue) {                 propValue = evaluate((TypedStringValue) propValue);             }             if (propKey == null || propValue == null) {                 throw new BeanCreationException(                         this.beanDefinition.getResourceDescription(), this.beanName,                         "Error converting Properties key/value pair for " + argName + ": resolved to null");             }             copy.put(propKey, propValue);         });         return copy;     }     // 解析String     else if (value instanceof TypedStringValue) {         // Convert value to target type here.         TypedStringValue typedStringValue = (TypedStringValue) value;         Object valueObject = evaluate(typedStringValue);         try {             Class<?> resolvedTargetType = resolveTargetType(typedStringValue);             if (resolvedTargetType != null) {                 return this.typeConverter.convertIfNecessary(valueObject, resolvedTargetType);             }             else {                 return valueObject;             }         }         catch (Throwable ex) {             // Improve the message by showing the context.             throw new BeanCreationException(                     this.beanDefinition.getResourceDescription(), this.beanName,                     "Error converting typed String value for " + argName, ex);         }     }     else if (value instanceof NullBean) {         return null;     }     else {         return evaluate(value);     } } |