Simplify ConstructorResolver: do not sort intermediate array
This commit is contained in:
committed by
Juergen Hoeller
parent
51b43496f4
commit
92efe95069
@@ -51,7 +51,7 @@ import org.springframework.util.ClassUtils;
|
||||
*/
|
||||
abstract class AutowireUtils {
|
||||
|
||||
private static final Comparator<Executable> EXECUTABLE_COMPARATOR = (e1, e2) -> {
|
||||
public static final Comparator<Executable> 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());
|
||||
};
|
||||
|
||||
@@ -453,27 +453,27 @@ class ConstructorResolver {
|
||||
// Try all methods with this name to see if they match the given arguments.
|
||||
factoryClass = ClassUtils.getUserClass(factoryClass);
|
||||
|
||||
List<Method> candidateList = null;
|
||||
List<Method> 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 @@ class ConstructorResolver {
|
||||
}
|
||||
}
|
||||
|
||||
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 @@ class ConstructorResolver {
|
||||
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()) {
|
||||
|
||||
Reference in New Issue
Block a user