|
|
|
@ -117,14 +117,20 @@ class ConstructorResolver { |
|
|
|
argsToUse = explicitArgs; |
|
|
|
argsToUse = explicitArgs; |
|
|
|
} |
|
|
|
} |
|
|
|
else { |
|
|
|
else { |
|
|
|
constructorToUse = (Constructor) mbd.resolvedConstructorOrFactoryMethod; |
|
|
|
Object[] argsToResolve = null; |
|
|
|
if (constructorToUse != null) { |
|
|
|
synchronized (mbd.constructorArgumentLock) { |
|
|
|
// Found a cached constructor...
|
|
|
|
constructorToUse = (Constructor) mbd.resolvedConstructorOrFactoryMethod; |
|
|
|
argsToUse = mbd.resolvedConstructorArguments; |
|
|
|
if (constructorToUse != null && mbd.constructorArgumentsResolved) { |
|
|
|
if (argsToUse == null) { |
|
|
|
// Found a cached constructor...
|
|
|
|
argsToUse = resolvePreparedArguments(beanName, mbd, bw, constructorToUse); |
|
|
|
argsToUse = mbd.resolvedConstructorArguments; |
|
|
|
|
|
|
|
if (argsToUse == null) { |
|
|
|
|
|
|
|
argsToResolve = mbd.preparedConstructorArguments; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (argsToResolve != null) { |
|
|
|
|
|
|
|
argsToUse = resolvePreparedArguments(beanName, mbd, bw, constructorToUse, argsToResolve); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (constructorToUse == null) { |
|
|
|
if (constructorToUse == null) { |
|
|
|
@ -254,8 +260,7 @@ class ConstructorResolver { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (explicitArgs == null) { |
|
|
|
if (explicitArgs == null) { |
|
|
|
mbd.resolvedConstructorOrFactoryMethod = constructorToUse; |
|
|
|
argsHolderToUse.storeCache(mbd, constructorToUse); |
|
|
|
argsHolderToUse.storeCache(mbd); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -312,7 +317,9 @@ class ConstructorResolver { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
mbd.resolvedConstructorOrFactoryMethod = uniqueCandidate; |
|
|
|
synchronized (mbd.constructorArgumentLock) { |
|
|
|
|
|
|
|
mbd.resolvedConstructorOrFactoryMethod = uniqueCandidate; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
@ -371,14 +378,20 @@ class ConstructorResolver { |
|
|
|
argsToUse = explicitArgs; |
|
|
|
argsToUse = explicitArgs; |
|
|
|
} |
|
|
|
} |
|
|
|
else { |
|
|
|
else { |
|
|
|
factoryMethodToUse = (Method) mbd.resolvedConstructorOrFactoryMethod; |
|
|
|
Object[] argsToResolve = null; |
|
|
|
if (factoryMethodToUse != null) { |
|
|
|
synchronized (mbd.constructorArgumentLock) { |
|
|
|
// Found a cached factory method...
|
|
|
|
factoryMethodToUse = (Method) mbd.resolvedConstructorOrFactoryMethod; |
|
|
|
argsToUse = mbd.resolvedConstructorArguments; |
|
|
|
if (factoryMethodToUse != null && mbd.constructorArgumentsResolved) { |
|
|
|
if (argsToUse == null && mbd.preparedConstructorArguments != null) { |
|
|
|
// Found a cached factory method...
|
|
|
|
argsToUse = resolvePreparedArguments(beanName, mbd, bw, factoryMethodToUse); |
|
|
|
argsToUse = mbd.resolvedConstructorArguments; |
|
|
|
|
|
|
|
if (argsToUse == null) { |
|
|
|
|
|
|
|
argsToResolve = mbd.preparedConstructorArguments; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (argsToResolve != null) { |
|
|
|
|
|
|
|
argsToUse = resolvePreparedArguments(beanName, mbd, bw, factoryMethodToUse, argsToResolve); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (factoryMethodToUse == null || argsToUse == null) { |
|
|
|
if (factoryMethodToUse == null || argsToUse == null) { |
|
|
|
@ -536,8 +549,7 @@ class ConstructorResolver { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (explicitArgs == null) { |
|
|
|
if (explicitArgs == null) { |
|
|
|
mbd.resolvedConstructorOrFactoryMethod = factoryMethodToUse; |
|
|
|
argsHolderToUse.storeCache(mbd, factoryMethodToUse); |
|
|
|
argsHolderToUse.storeCache(mbd); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -734,11 +746,10 @@ 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( |
|
|
|
private Object[] resolvePreparedArguments( |
|
|
|
String beanName, RootBeanDefinition mbd, BeanWrapper bw, Member methodOrCtor) { |
|
|
|
String beanName, RootBeanDefinition mbd, BeanWrapper bw, Member methodOrCtor, Object[] argsToResolve) { |
|
|
|
|
|
|
|
|
|
|
|
Class[] paramTypes = (methodOrCtor instanceof Method ? |
|
|
|
Class[] paramTypes = (methodOrCtor instanceof Method ? |
|
|
|
((Method) methodOrCtor).getParameterTypes() : ((Constructor) methodOrCtor).getParameterTypes()); |
|
|
|
((Method) methodOrCtor).getParameterTypes() : ((Constructor) methodOrCtor).getParameterTypes()); |
|
|
|
Object[] argsToResolve = mbd.preparedConstructorArguments; |
|
|
|
|
|
|
|
TypeConverter converter = (this.beanFactory.getCustomTypeConverter() != null ? |
|
|
|
TypeConverter converter = (this.beanFactory.getCustomTypeConverter() != null ? |
|
|
|
this.beanFactory.getCustomTypeConverter() : bw); |
|
|
|
this.beanFactory.getCustomTypeConverter() : bw); |
|
|
|
BeanDefinitionValueResolver valueResolver = |
|
|
|
BeanDefinitionValueResolver valueResolver = |
|
|
|
@ -789,11 +800,11 @@ class ConstructorResolver { |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
private static class ArgumentsHolder { |
|
|
|
private static class ArgumentsHolder { |
|
|
|
|
|
|
|
|
|
|
|
public Object rawArguments[]; |
|
|
|
public final Object rawArguments[]; |
|
|
|
|
|
|
|
|
|
|
|
public Object arguments[]; |
|
|
|
public final Object arguments[]; |
|
|
|
|
|
|
|
|
|
|
|
public Object preparedArguments[]; |
|
|
|
public final Object preparedArguments[]; |
|
|
|
|
|
|
|
|
|
|
|
public boolean resolveNecessary = false; |
|
|
|
public boolean resolveNecessary = false; |
|
|
|
|
|
|
|
|
|
|
|
@ -833,14 +844,17 @@ class ConstructorResolver { |
|
|
|
return Integer.MAX_VALUE - 1024; |
|
|
|
return Integer.MAX_VALUE - 1024; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public void storeCache(RootBeanDefinition mbd) { |
|
|
|
public void storeCache(RootBeanDefinition mbd, Object constructorOrFactoryMethod) { |
|
|
|
if (this.resolveNecessary) { |
|
|
|
synchronized (mbd.constructorArgumentLock) { |
|
|
|
mbd.preparedConstructorArguments = this.preparedArguments; |
|
|
|
mbd.resolvedConstructorOrFactoryMethod = constructorOrFactoryMethod; |
|
|
|
} |
|
|
|
mbd.constructorArgumentsResolved = true; |
|
|
|
else { |
|
|
|
if (this.resolveNecessary) { |
|
|
|
mbd.resolvedConstructorArguments = this.arguments; |
|
|
|
mbd.preparedConstructorArguments = this.preparedArguments; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else { |
|
|
|
|
|
|
|
mbd.resolvedConstructorArguments = this.arguments; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
mbd.constructorArgumentsResolved = true; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|