diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/config/ConstructorArgumentValues.java b/spring-beans/src/main/java/org/springframework/beans/factory/config/ConstructorArgumentValues.java index 836b868c74d6..a02f6ab3dbc3 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/config/ConstructorArgumentValues.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/config/ConstructorArgumentValues.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2021 the original author or authors. + * Copyright 2002-2022 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -360,6 +360,25 @@ public ValueHolder getArgumentValue(int index, @Nullable Class requiredType, return valueHolder; } + /** + * Determine whether at least one argument value refers to a name. + * @since 6.0.3 + * @see ValueHolder#getName() + */ + public boolean containsNamedArgument() { + for (ValueHolder valueHolder : this.indexedArgumentValues.values()) { + if (valueHolder.getName() != null) { + return true; + } + } + for (ValueHolder valueHolder : this.genericArgumentValues) { + if (valueHolder.getName() != null) { + return true; + } + } + return false; + } + /** * Return the number of argument values held in this instance, * counting both indexed and generic argument values. 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 4985d0bc5be0..e5b364630ff2 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 @@ -232,11 +232,14 @@ public BeanWrapper autowireConstructor(String beanName, RootBeanDefinition mbd, Class[] paramTypes = candidate.getParameterTypes(); if (resolvedValues != null) { try { - String[] paramNames = ConstructorPropertiesChecker.evaluate(candidate, parameterCount); - if (paramNames == null) { - ParameterNameDiscoverer pnd = this.beanFactory.getParameterNameDiscoverer(); - if (pnd != null) { - paramNames = pnd.getParameterNames(candidate); + String[] paramNames = null; + if (resolvedValues.containsNamedArgument()) { + paramNames = ConstructorPropertiesChecker.evaluate(candidate, parameterCount); + if (paramNames == null) { + ParameterNameDiscoverer pnd = this.beanFactory.getParameterNameDiscoverer(); + if (pnd != null) { + paramNames = pnd.getParameterNames(candidate); + } } } argsHolder = createArgumentArray(beanName, mbd, resolvedValues, bw, paramTypes, paramNames, @@ -536,9 +539,11 @@ public BeanWrapper instantiateUsingFactoryMethod( // Resolved constructor arguments: type conversion and/or autowiring necessary. try { String[] paramNames = null; - ParameterNameDiscoverer pnd = this.beanFactory.getParameterNameDiscoverer(); - if (pnd != null) { - paramNames = pnd.getParameterNames(candidate); + if (resolvedValues != null && resolvedValues.containsNamedArgument()) { + ParameterNameDiscoverer pnd = this.beanFactory.getParameterNameDiscoverer(); + if (pnd != null) { + paramNames = pnd.getParameterNames(candidate); + } } argsHolder = createArgumentArray(beanName, mbd, resolvedValues, bw, paramTypes, paramNames, candidate, autowiring, candidates.size() == 1);