5.x primavera trip Fuente veinticinco getBean detallada constructor de diez arg montaje automático autowireConstructor

El método de la autowireConstructor automática de montaje configurado

pide asimismo internos ConstructorResolvermétodos.

protected BeanWrapper autowireConstructor(
			String beanName, RootBeanDefinition mbd, @Nullable Constructor<?>[] ctors, @Nullable Object[] explicitArgs) {

		return new ConstructorResolver(this).autowireConstructor(beanName, mbd, ctors, explicitArgs);
	}

ConstructorResolver 的 autowireConstructor

Este método de fábrica y la llamada de datos para crear una instancia instantiateUsingFactoryMethodsimilar, hay algunos lugares no son lo mismo.

  • método de fábrica recorrer todo el camino hasta el final, y luego encontrar los tipos de parámetros método de las diferencias más pequeñas, y el método de construcción de montaje automático para encontrar una que satisface la condición se detuvo.
  • Tipo de parámetro algoritmo de diferenciación no es lo mismo, el método de fábrica es un método estricto getAssignabilityWeight, y un método de montaje automático está suelto getTypeDifferenceWeight.

ConstructorResolver 的 getTypeDifferenceWeight

Obtiene el tipo de parámetro y su tipo de la diferencia original, pero aún con el tipo original de prioridad, también a causa de diferencias en el valor-1024.

//获取类型差异值
		public int getTypeDifferenceWeight(Class<?>[] paramTypes) {
			
			//找出参数类型,和原始参数类型的差异,选最小的
			int typeDiffWeight = MethodInvoker.getTypeDifferenceWeight(paramTypes, this.arguments);
			int rawTypeDiffWeight = MethodInvoker.getTypeDifferenceWeight(paramTypes, this.rawArguments) - 1024;
			return Math.min(rawTypeDiffWeight, typeDiffWeight);
		}

MethodInvoker 的 getTypeDifferenceWeight

Aquí está el tipo de parámetro de tipos y métodos de la comparación de los parámetros de entrada, si no se hereda definidos, vuelve directamente la diferencia más grande, si es heredado, adquirido los parámetros de entrada de los padres, si el tipo de clase padre es el tipo de parámetro, la diferencia +2, de lo contrario determinar si el tipo de clase padre es una subclase del tipo de parámetro, entonces la diferencia es +2, y luego continúan buscando a los padres de la clase padre, hasta que ninguno de los padres hasta el momento, el último parámetro es el tipo de interfaz si encuentra la diferencia +1, y luego devolver la diferencia.

public static int getTypeDifferenceWeight(Class<?>[] paramTypes, Object[] args) {
		int result = 0;
		for (int i = 0; i < paramTypes.length; i++) {
			if (!ClassUtils.isAssignableValue(paramTypes[i], args[i])) {
				return Integer.MAX_VALUE;//有参数类型不匹配直接返回最大差异
			}
			if (args[i] != null) {
				Class<?> paramType = paramTypes[i];
				Class<?> superClass = args[i].getClass().getSuperclass();//获得传入参数的父类来比较
				while (superClass != null) {
					if (paramType.equals(superClass)) {//参数类型等于父类型的,差异+2
						result = result + 2;
						superClass = null;
					}
					else if (ClassUtils.isAssignable(paramType, superClass)) {//superClass是paramType的子类类型,差异+2,可能还有paramType的子类类型,再尝试获取
						result = result + 2;
						superClass = superClass.getSuperclass();
					}
					else {
						superClass = null;
					}
				}
				if (paramType.isInterface()) {//参数类型是接口类型,差异+1
					result = result + 1;
				}
			}
		}
		return result;
	}

ClassUtils de isAssignable si la comparación es del mismo tipo, o subclase

Comparación de dos clases principales clase no es el mismo o subclase, es decir, rhsTypeno es lhsTypeuna subclase o similar.

public static boolean isAssignable(Class<?> lhsType, Class<?> rhsType) {
		Assert.notNull(lhsType, "Left-hand side type must not be null");
		Assert.notNull(rhsType, "Right-hand side type must not be null");
		if (lhsType.isAssignableFrom(rhsType)) {
			return true;
		}
		if (lhsType.isPrimitive()) {
			Class<?> resolvedPrimitive = primitiveWrapperTypeMap.get(rhsType);
			if (lhsType == resolvedPrimitive) {
				return true;
			}
		}
		else {
			Class<?> resolvedWrapper = primitiveTypeToWrapperMap.get(rhsType);
			if (resolvedWrapper != null && lhsType.isAssignableFrom(resolvedWrapper)) {
				return true;
			}
		}
		return false;
	}
的 isAssignableFrom Clase

a.isAssignableFrom(b), Que bno es ade la misma clase o subclase.
Aquí Insertar imagen Descripción
Pues bien, hoy aquí, esperamos estudio ayuda y entender, no rocíe el Gran Dios ver, comprender solamente su propio aprendizaje, capacidad limitada, por favor excusa.

Publicados 235 artículos originales · ganado elogios 74 · Vistas a 30000 +

Supongo que te gusta

Origin blog.csdn.net/wangwei19871103/article/details/105117687
Recomendado
Clasificación