|
|
|
@ -66,6 +66,7 @@ import org.springframework.util.StringUtils; |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* Delegate for resolving constructors and factory methods. |
|
|
|
* Delegate for resolving constructors and factory methods. |
|
|
|
|
|
|
|
* |
|
|
|
* <p>Performs constructor resolution through argument matching. |
|
|
|
* <p>Performs constructor resolution through argument matching. |
|
|
|
* |
|
|
|
* |
|
|
|
* @author Juergen Hoeller |
|
|
|
* @author Juergen Hoeller |
|
|
|
@ -84,7 +85,7 @@ class ConstructorResolver { |
|
|
|
private static final Object[] EMPTY_ARGS = new Object[0]; |
|
|
|
private static final Object[] EMPTY_ARGS = new Object[0]; |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* Marker for autowired arguments in a cached argument array, to be later replaced |
|
|
|
* Marker for autowired arguments in a cached argument array, to be replaced |
|
|
|
* by a {@linkplain #resolveAutowiredArgument resolved autowired argument}. |
|
|
|
* by a {@linkplain #resolveAutowiredArgument resolved autowired argument}. |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
private static final Object autowiredArgumentMarker = new Object(); |
|
|
|
private static final Object autowiredArgumentMarker = new Object(); |
|
|
|
@ -148,7 +149,7 @@ class ConstructorResolver { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
if (argsToResolve != null) { |
|
|
|
if (argsToResolve != null) { |
|
|
|
argsToUse = resolvePreparedArguments(beanName, mbd, bw, constructorToUse, argsToResolve, true); |
|
|
|
argsToUse = resolvePreparedArguments(beanName, mbd, bw, constructorToUse, argsToResolve); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -409,6 +410,7 @@ class ConstructorResolver { |
|
|
|
if (mbd.isSingleton() && this.beanFactory.containsSingleton(beanName)) { |
|
|
|
if (mbd.isSingleton() && this.beanFactory.containsSingleton(beanName)) { |
|
|
|
throw new ImplicitlyAppearedSingletonException(); |
|
|
|
throw new ImplicitlyAppearedSingletonException(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
this.beanFactory.registerDependentBean(factoryBeanName, beanName); |
|
|
|
factoryClass = factoryBean.getClass(); |
|
|
|
factoryClass = factoryBean.getClass(); |
|
|
|
isStatic = false; |
|
|
|
isStatic = false; |
|
|
|
} |
|
|
|
} |
|
|
|
@ -443,7 +445,7 @@ class ConstructorResolver { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
if (argsToResolve != null) { |
|
|
|
if (argsToResolve != null) { |
|
|
|
argsToUse = resolvePreparedArguments(beanName, mbd, bw, factoryMethodToUse, argsToResolve, true); |
|
|
|
argsToUse = resolvePreparedArguments(beanName, mbd, bw, factoryMethodToUse, argsToResolve); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -815,7 +817,7 @@ class ConstructorResolver { |
|
|
|
* Resolve the prepared arguments stored in the given bean definition. |
|
|
|
* Resolve the prepared arguments stored in the given bean definition. |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
private Object[] resolvePreparedArguments(String beanName, RootBeanDefinition mbd, BeanWrapper bw, |
|
|
|
private Object[] resolvePreparedArguments(String beanName, RootBeanDefinition mbd, BeanWrapper bw, |
|
|
|
Executable executable, Object[] argsToResolve, boolean fallback) { |
|
|
|
Executable executable, Object[] argsToResolve) { |
|
|
|
|
|
|
|
|
|
|
|
TypeConverter customConverter = this.beanFactory.getCustomTypeConverter(); |
|
|
|
TypeConverter customConverter = this.beanFactory.getCustomTypeConverter(); |
|
|
|
TypeConverter converter = (customConverter != null ? customConverter : bw); |
|
|
|
TypeConverter converter = (customConverter != null ? customConverter : bw); |
|
|
|
@ -828,7 +830,7 @@ class ConstructorResolver { |
|
|
|
Object argValue = argsToResolve[argIndex]; |
|
|
|
Object argValue = argsToResolve[argIndex]; |
|
|
|
MethodParameter methodParam = MethodParameter.forExecutable(executable, argIndex); |
|
|
|
MethodParameter methodParam = MethodParameter.forExecutable(executable, argIndex); |
|
|
|
if (argValue == autowiredArgumentMarker) { |
|
|
|
if (argValue == autowiredArgumentMarker) { |
|
|
|
argValue = resolveAutowiredArgument(methodParam, beanName, null, converter, fallback); |
|
|
|
argValue = resolveAutowiredArgument(methodParam, beanName, null, converter, true); |
|
|
|
} |
|
|
|
} |
|
|
|
else if (argValue instanceof BeanMetadataElement) { |
|
|
|
else if (argValue instanceof BeanMetadataElement) { |
|
|
|
argValue = valueResolver.resolveValueIfNecessary("constructor argument", argValue); |
|
|
|
argValue = valueResolver.resolveValueIfNecessary("constructor argument", argValue); |
|
|
|
|