resolve dependency outside of synchronized block before subsequently preparing cached arguments (SPR-7635)

This commit is contained in:
Juergen Hoeller 2010-10-13 23:22:57 +00:00
parent 7893b3ebf6
commit 27a10c74d1
1 changed files with 27 additions and 32 deletions

View File

@ -468,14 +468,14 @@ public class AutowiredAnnotationBeanPostProcessor extends InstantiationAwareBean
value = resolvedCachedArgument(beanName, this.cachedFieldValue); value = resolvedCachedArgument(beanName, this.cachedFieldValue);
} }
else { else {
synchronized (pvs) { DependencyDescriptor descriptor = new DependencyDescriptor(field, this.required);
if (!this.cached) {
Set<String> autowiredBeanNames = new LinkedHashSet<String>(1); Set<String> autowiredBeanNames = new LinkedHashSet<String>(1);
TypeConverter typeConverter = beanFactory.getTypeConverter(); TypeConverter typeConverter = beanFactory.getTypeConverter();
DependencyDescriptor descriptor = new DependencyDescriptor(field, this.required);
this.cachedFieldValue = descriptor;
value = beanFactory.resolveDependency(descriptor, beanName, autowiredBeanNames, typeConverter); value = beanFactory.resolveDependency(descriptor, beanName, autowiredBeanNames, typeConverter);
synchronized (this) {
if (!this.cached) {
if (value != null) { if (value != null) {
this.cachedFieldValue = descriptor;
registerDependentBeans(beanName, autowiredBeanNames); registerDependentBeans(beanName, autowiredBeanNames);
if (autowiredBeanNames.size() == 1) { if (autowiredBeanNames.size() == 1) {
String autowiredBeanName = autowiredBeanNames.iterator().next(); String autowiredBeanName = autowiredBeanNames.iterator().next();
@ -491,10 +491,6 @@ public class AutowiredAnnotationBeanPostProcessor extends InstantiationAwareBean
} }
this.cached = true; this.cached = true;
} }
else {
// Already cached in the meantime...
value = resolvedCachedArgument(beanName, this.cachedFieldValue);
}
} }
} }
if (value != null) { if (value != null) {
@ -538,26 +534,29 @@ public class AutowiredAnnotationBeanPostProcessor extends InstantiationAwareBean
arguments = resolveCachedArguments(beanName); arguments = resolveCachedArguments(beanName);
} }
else { else {
synchronized (pvs) {
if (!this.cached) {
Class[] paramTypes = method.getParameterTypes(); Class[] paramTypes = method.getParameterTypes();
arguments = new Object[paramTypes.length]; arguments = new Object[paramTypes.length];
Set<String> autowiredBeanNames = new LinkedHashSet<String>(arguments.length); DependencyDescriptor[] descriptors = new DependencyDescriptor[paramTypes.length];
Set<String> autowiredBeanNames = new LinkedHashSet<String>(paramTypes.length);
TypeConverter typeConverter = beanFactory.getTypeConverter(); TypeConverter typeConverter = beanFactory.getTypeConverter();
this.cachedMethodArguments = new Object[arguments.length];
for (int i = 0; i < arguments.length; i++) { for (int i = 0; i < arguments.length; i++) {
MethodParameter methodParam = new MethodParameter(method, i); MethodParameter methodParam = new MethodParameter(method, i);
GenericTypeResolver.resolveParameterType(methodParam, bean.getClass()); GenericTypeResolver.resolveParameterType(methodParam, bean.getClass());
DependencyDescriptor descriptor = new DependencyDescriptor(methodParam, this.required); descriptors[i] = new DependencyDescriptor(methodParam, this.required);
this.cachedMethodArguments[i] = descriptor;
arguments[i] = beanFactory.resolveDependency( arguments[i] = beanFactory.resolveDependency(
descriptor, beanName, autowiredBeanNames, typeConverter); descriptors[i], beanName, autowiredBeanNames, typeConverter);
if (arguments[i] == null) { if (arguments[i] == null) {
arguments = null; arguments = null;
break; break;
} }
} }
synchronized (this) {
if (!this.cached) {
if (arguments != null) { if (arguments != null) {
this.cachedMethodArguments = new Object[arguments.length];
for (int i = 0; i < arguments.length; i++) {
this.cachedMethodArguments[i] = descriptors[i];
}
registerDependentBeans(beanName, autowiredBeanNames); registerDependentBeans(beanName, autowiredBeanNames);
if (autowiredBeanNames.size() == paramTypes.length) { if (autowiredBeanNames.size() == paramTypes.length) {
Iterator<String> it = autowiredBeanNames.iterator(); Iterator<String> it = autowiredBeanNames.iterator();
@ -579,10 +578,6 @@ public class AutowiredAnnotationBeanPostProcessor extends InstantiationAwareBean
} }
this.cached = true; this.cached = true;
} }
else {
// Already cached in the meantime...
arguments = resolveCachedArguments(beanName);
}
} }
} }
if (arguments != null) { if (arguments != null) {