diff --git a/org.springframework.beans/src/main/java/org/springframework/beans/factory/annotation/InitDestroyAnnotationBeanPostProcessor.java b/org.springframework.beans/src/main/java/org/springframework/beans/factory/annotation/InitDestroyAnnotationBeanPostProcessor.java index 4c2db7df864f..f584458f440a 100644 --- a/org.springframework.beans/src/main/java/org/springframework/beans/factory/annotation/InitDestroyAnnotationBeanPostProcessor.java +++ b/org.springframework.beans/src/main/java/org/springframework/beans/factory/annotation/InitDestroyAnnotationBeanPostProcessor.java @@ -24,6 +24,7 @@ import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.Collection; +import java.util.Collections; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.LinkedList; @@ -246,7 +247,7 @@ private class LifecycleMetadata { public LifecycleMetadata(Class targetClass, Collection initMethods, Collection destroyMethods) { - this.initMethods = new LinkedHashSet(); + this.initMethods = Collections.synchronizedSet(new LinkedHashSet()); for (LifecycleElement element : initMethods) { if (logger.isDebugEnabled()) { logger.debug("Found init method on class [" + targetClass.getName() + "]: " + element); @@ -254,7 +255,7 @@ public LifecycleMetadata(Class targetClass, Collection init this.initMethods.add(element); } - this.destroyMethods = new LinkedHashSet(); + this.destroyMethods = Collections.synchronizedSet(new LinkedHashSet()); for (LifecycleElement element : destroyMethods) { if (logger.isDebugEnabled()) { logger.debug("Found destroy method on class [" + targetClass.getName() + "]: " + element); @@ -264,22 +265,26 @@ public LifecycleMetadata(Class targetClass, Collection init } public void checkConfigMembers(RootBeanDefinition beanDefinition) { - for (Iterator it = this.initMethods.iterator(); it.hasNext();) { - String methodIdentifier = it.next().getIdentifier(); - if (!beanDefinition.isExternallyManagedInitMethod(methodIdentifier)) { - beanDefinition.registerExternallyManagedInitMethod(methodIdentifier); - } - else { - it.remove(); + synchronized(this.initMethods) { + for (Iterator it = this.initMethods.iterator(); it.hasNext();) { + String methodIdentifier = it.next().getIdentifier(); + if (!beanDefinition.isExternallyManagedInitMethod(methodIdentifier)) { + beanDefinition.registerExternallyManagedInitMethod(methodIdentifier); + } + else { + it.remove(); + } } } - for (Iterator it = this.destroyMethods.iterator(); it.hasNext();) { - String methodIdentifier = it.next().getIdentifier(); - if (!beanDefinition.isExternallyManagedDestroyMethod(methodIdentifier)) { - beanDefinition.registerExternallyManagedDestroyMethod(methodIdentifier); - } - else { - it.remove(); + synchronized(this.destroyMethods) { + for (Iterator it = this.destroyMethods.iterator(); it.hasNext();) { + String methodIdentifier = it.next().getIdentifier(); + if (!beanDefinition.isExternallyManagedDestroyMethod(methodIdentifier)) { + beanDefinition.registerExternallyManagedDestroyMethod(methodIdentifier); + } + else { + it.remove(); + } } } } diff --git a/org.springframework.beans/src/main/java/org/springframework/beans/factory/annotation/InjectionMetadata.java b/org.springframework.beans/src/main/java/org/springframework/beans/factory/annotation/InjectionMetadata.java index 227605b5a004..4a1733de3077 100644 --- a/org.springframework.beans/src/main/java/org/springframework/beans/factory/annotation/InjectionMetadata.java +++ b/org.springframework.beans/src/main/java/org/springframework/beans/factory/annotation/InjectionMetadata.java @@ -22,6 +22,7 @@ import java.lang.reflect.Member; import java.lang.reflect.Method; import java.util.Collection; +import java.util.Collections; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.Set; @@ -53,7 +54,7 @@ public class InjectionMetadata { public InjectionMetadata(Class targetClass, Collection elements) { - this.injectedElements = new LinkedHashSet(); + this.injectedElements = Collections.synchronizedSet(new LinkedHashSet()); for (InjectedElement element : elements) { if (logger.isDebugEnabled()) { logger.debug("Found injected element on class [" + targetClass.getName() + "]: " + element); @@ -63,13 +64,15 @@ public InjectionMetadata(Class targetClass, Collection elements } public void checkConfigMembers(RootBeanDefinition beanDefinition) { - for (Iterator it = this.injectedElements.iterator(); it.hasNext();) { - Member member = it.next().getMember(); - if (!beanDefinition.isExternallyManagedConfigMember(member)) { - beanDefinition.registerExternallyManagedConfigMember(member); - } - else { - it.remove(); + synchronized(this.injectedElements) { + for (Iterator it = this.injectedElements.iterator(); it.hasNext();) { + Member member = it.next().getMember(); + if (!beanDefinition.isExternallyManagedConfigMember(member)) { + beanDefinition.registerExternallyManagedConfigMember(member); + } + else { + it.remove(); + } } } }