Browse Source

Simplify ConstructorResolver: do not sort intermediate array

pull/27210/head
stsypanov 5 years ago committed by Juergen Hoeller
parent
commit
92efe95069
  1. 2
      spring-beans/src/main/java/org/springframework/beans/factory/support/AutowireUtils.java
  2. 19
      spring-beans/src/main/java/org/springframework/beans/factory/support/ConstructorResolver.java

2
spring-beans/src/main/java/org/springframework/beans/factory/support/AutowireUtils.java

@ -51,7 +51,7 @@ import org.springframework.util.ClassUtils; @@ -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());
};

19
spring-beans/src/main/java/org/springframework/beans/factory/support/ConstructorResolver.java

@ -453,27 +453,27 @@ class ConstructorResolver { @@ -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 { @@ -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 { @@ -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()) {

Loading…
Cancel
Save