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 ConstructorResolver
mé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 instantiateUsingFactoryMethod
similar, 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á sueltogetTypeDifferenceWeight
.
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, rhsType
no es lhsType
una 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 b
no es a
de la misma clase o subclase.
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.