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;
*/ */
abstract class AutowireUtils { 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())); int result = Boolean.compare(Modifier.isPublic(e2.getModifiers()), Modifier.isPublic(e1.getModifiers()));
return result != 0 ? result : Integer.compare(e2.getParameterCount(), e1.getParameterCount()); 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 {
// Try all methods with this name to see if they match the given arguments. // Try all methods with this name to see if they match the given arguments.
factoryClass = ClassUtils.getUserClass(factoryClass); factoryClass = ClassUtils.getUserClass(factoryClass);
List<Method> candidateList = null; List<Method> candidates = null;
if (mbd.isFactoryMethodUnique) { if (mbd.isFactoryMethodUnique) {
if (factoryMethodToUse == null) { if (factoryMethodToUse == null) {
factoryMethodToUse = mbd.getResolvedFactoryMethod(); factoryMethodToUse = mbd.getResolvedFactoryMethod();
} }
if (factoryMethodToUse != null) { if (factoryMethodToUse != null) {
candidateList = Collections.singletonList(factoryMethodToUse); candidates = Collections.singletonList(factoryMethodToUse);
} }
} }
if (candidateList == null) { if (candidates == null) {
candidateList = new ArrayList<>(); candidates = new ArrayList<>();
Method[] rawCandidates = getCandidateMethods(factoryClass, mbd); Method[] rawCandidates = getCandidateMethods(factoryClass, mbd);
for (Method candidate : rawCandidates) { for (Method candidate : rawCandidates) {
if (Modifier.isStatic(candidate.getModifiers()) == isStatic && mbd.isFactoryMethod(candidate)) { if (Modifier.isStatic(candidate.getModifiers()) == isStatic && mbd.isFactoryMethod(candidate)) {
candidateList.add(candidate); candidates.add(candidate);
} }
} }
} }
if (candidateList.size() == 1 && explicitArgs == null && !mbd.hasConstructorArgumentValues()) { if (candidates.size() == 1 && explicitArgs == null && !mbd.hasConstructorArgumentValues()) {
Method uniqueCandidate = candidateList.get(0); Method uniqueCandidate = candidates.get(0);
if (uniqueCandidate.getParameterCount() == 0) { if (uniqueCandidate.getParameterCount() == 0) {
mbd.factoryMethodToIntrospect = uniqueCandidate; mbd.factoryMethodToIntrospect = uniqueCandidate;
synchronized (mbd.constructorArgumentLock) { synchronized (mbd.constructorArgumentLock) {
@ -486,8 +486,7 @@ class ConstructorResolver {
} }
} }
Method[] candidates = candidateList.toArray(new Method[0]); candidates.sort(AutowireUtils.EXECUTABLE_COMPARATOR);
AutowireUtils.sortFactoryMethods(candidates);
ConstructorArgumentValues resolvedValues = null; ConstructorArgumentValues resolvedValues = null;
boolean autowiring = (mbd.getResolvedAutowireMode() == AutowireCapableBeanFactory.AUTOWIRE_CONSTRUCTOR); boolean autowiring = (mbd.getResolvedAutowireMode() == AutowireCapableBeanFactory.AUTOWIRE_CONSTRUCTOR);
@ -536,7 +535,7 @@ class ConstructorResolver {
paramNames = pnd.getParameterNames(candidate); paramNames = pnd.getParameterNames(candidate);
} }
argsHolder = createArgumentArray(beanName, mbd, resolvedValues, bw, argsHolder = createArgumentArray(beanName, mbd, resolvedValues, bw,
paramTypes, paramNames, candidate, autowiring, candidates.length == 1); paramTypes, paramNames, candidate, autowiring, candidates.size() == 1);
} }
catch (UnsatisfiedDependencyException ex) { catch (UnsatisfiedDependencyException ex) {
if (logger.isTraceEnabled()) { if (logger.isTraceEnabled()) {

Loading…
Cancel
Save