Skip to content

Commit e47978e

Browse files
committed
Avoid unnecessary parameter name inspection for constructor-arg resolution
Closes gh-29612
1 parent 52e967a commit e47978e

File tree

2 files changed

+33
-9
lines changed

2 files changed

+33
-9
lines changed

spring-beans/src/main/java/org/springframework/beans/factory/config/ConstructorArgumentValues.java

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2021 the original author or authors.
2+
* Copyright 2002-2022 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -360,6 +360,25 @@ public ValueHolder getArgumentValue(int index, @Nullable Class<?> requiredType,
360360
return valueHolder;
361361
}
362362

363+
/**
364+
* Determine whether at least one argument value refers to a name.
365+
* @since 6.0.3
366+
* @see ValueHolder#getName()
367+
*/
368+
public boolean containsNamedArgument() {
369+
for (ValueHolder valueHolder : this.indexedArgumentValues.values()) {
370+
if (valueHolder.getName() != null) {
371+
return true;
372+
}
373+
}
374+
for (ValueHolder valueHolder : this.genericArgumentValues) {
375+
if (valueHolder.getName() != null) {
376+
return true;
377+
}
378+
}
379+
return false;
380+
}
381+
363382
/**
364383
* Return the number of argument values held in this instance,
365384
* counting both indexed and generic argument values.

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

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -232,11 +232,14 @@ public BeanWrapper autowireConstructor(String beanName, RootBeanDefinition mbd,
232232
Class<?>[] paramTypes = candidate.getParameterTypes();
233233
if (resolvedValues != null) {
234234
try {
235-
String[] paramNames = ConstructorPropertiesChecker.evaluate(candidate, parameterCount);
236-
if (paramNames == null) {
237-
ParameterNameDiscoverer pnd = this.beanFactory.getParameterNameDiscoverer();
238-
if (pnd != null) {
239-
paramNames = pnd.getParameterNames(candidate);
235+
String[] paramNames = null;
236+
if (resolvedValues.containsNamedArgument()) {
237+
paramNames = ConstructorPropertiesChecker.evaluate(candidate, parameterCount);
238+
if (paramNames == null) {
239+
ParameterNameDiscoverer pnd = this.beanFactory.getParameterNameDiscoverer();
240+
if (pnd != null) {
241+
paramNames = pnd.getParameterNames(candidate);
242+
}
240243
}
241244
}
242245
argsHolder = createArgumentArray(beanName, mbd, resolvedValues, bw, paramTypes, paramNames,
@@ -536,9 +539,11 @@ public BeanWrapper instantiateUsingFactoryMethod(
536539
// Resolved constructor arguments: type conversion and/or autowiring necessary.
537540
try {
538541
String[] paramNames = null;
539-
ParameterNameDiscoverer pnd = this.beanFactory.getParameterNameDiscoverer();
540-
if (pnd != null) {
541-
paramNames = pnd.getParameterNames(candidate);
542+
if (resolvedValues != null && resolvedValues.containsNamedArgument()) {
543+
ParameterNameDiscoverer pnd = this.beanFactory.getParameterNameDiscoverer();
544+
if (pnd != null) {
545+
paramNames = pnd.getParameterNames(candidate);
546+
}
542547
}
543548
argsHolder = createArgumentArray(beanName, mbd, resolvedValues, bw,
544549
paramTypes, paramNames, candidate, autowiring, candidates.size() == 1);

0 commit comments

Comments
 (0)