From 92efe95069c4fc5969e8f4f4f84ee09c426fba5c Mon Sep 17 00:00:00 2001 From: stsypanov Date: Mon, 11 Nov 2019 11:59:50 +0200 Subject: [PATCH] Simplify ConstructorResolver: do not sort intermediate array --- .../beans/factory/support/AutowireUtils.java | 2 +- .../factory/support/ConstructorResolver.java | 19 +++++++++---------- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/AutowireUtils.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/AutowireUtils.java index 67f952567573..50adef4df217 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/AutowireUtils.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/AutowireUtils.java @@ -51,7 +51,7 @@ */ abstract class AutowireUtils { - private static final Comparator EXECUTABLE_COMPARATOR = (e1, e2) -> { + public static final Comparator EXECUTABLE_COMPARATOR = (e1, e2) -> { int result = Boolean.compare(Modifier.isPublic(e2.getModifiers()), Modifier.isPublic(e1.getModifiers())); return result != 0 ? result : Integer.compare(e2.getParameterCount(), e1.getParameterCount()); }; diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/ConstructorResolver.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/ConstructorResolver.java index cf43c433a26c..d98b72efc732 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/ConstructorResolver.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/ConstructorResolver.java @@ -453,27 +453,27 @@ public BeanWrapper instantiateUsingFactoryMethod( // Try all methods with this name to see if they match the given arguments. factoryClass = ClassUtils.getUserClass(factoryClass); - List candidateList = null; + List candidates = null; if (mbd.isFactoryMethodUnique) { if (factoryMethodToUse == null) { factoryMethodToUse = mbd.getResolvedFactoryMethod(); } if (factoryMethodToUse != null) { - candidateList = Collections.singletonList(factoryMethodToUse); + candidates = Collections.singletonList(factoryMethodToUse); } } - if (candidateList == null) { - candidateList = new ArrayList<>(); + if (candidates == null) { + candidates = new ArrayList<>(); Method[] rawCandidates = getCandidateMethods(factoryClass, mbd); for (Method candidate : rawCandidates) { if (Modifier.isStatic(candidate.getModifiers()) == isStatic && mbd.isFactoryMethod(candidate)) { - candidateList.add(candidate); + candidates.add(candidate); } } } - if (candidateList.size() == 1 && explicitArgs == null && !mbd.hasConstructorArgumentValues()) { - Method uniqueCandidate = candidateList.get(0); + if (candidates.size() == 1 && explicitArgs == null && !mbd.hasConstructorArgumentValues()) { + Method uniqueCandidate = candidates.get(0); if (uniqueCandidate.getParameterCount() == 0) { mbd.factoryMethodToIntrospect = uniqueCandidate; synchronized (mbd.constructorArgumentLock) { @@ -486,8 +486,7 @@ public BeanWrapper instantiateUsingFactoryMethod( } } - Method[] candidates = candidateList.toArray(new Method[0]); - AutowireUtils.sortFactoryMethods(candidates); + candidates.sort(AutowireUtils.EXECUTABLE_COMPARATOR); ConstructorArgumentValues resolvedValues = null; boolean autowiring = (mbd.getResolvedAutowireMode() == AutowireCapableBeanFactory.AUTOWIRE_CONSTRUCTOR); @@ -536,7 +535,7 @@ public BeanWrapper instantiateUsingFactoryMethod( paramNames = pnd.getParameterNames(candidate); } argsHolder = createArgumentArray(beanName, mbd, resolvedValues, bw, - paramTypes, paramNames, candidate, autowiring, candidates.length == 1); + paramTypes, paramNames, candidate, autowiring, candidates.size() == 1); } catch (UnsatisfiedDependencyException ex) { if (logger.isTraceEnabled()) {