diff --git a/org.springframework.context/src/main/java/org/springframework/context/event/AbstractApplicationEventMulticaster.java b/org.springframework.context/src/main/java/org/springframework/context/event/AbstractApplicationEventMulticaster.java index fa2106c642..7721da18d7 100644 --- a/org.springframework.context/src/main/java/org/springframework/context/event/AbstractApplicationEventMulticaster.java +++ b/org.springframework.context/src/main/java/org/springframework/context/event/AbstractApplicationEventMulticaster.java @@ -59,24 +59,39 @@ public abstract class AbstractApplicationEventMulticaster implements Application public void addApplicationListener(ApplicationListener listener) { - this.defaultRetriever.applicationListeners.add(listener); + synchronized (this.defaultRetriever) { + this.defaultRetriever.applicationListeners.add(listener); + this.retrieverCache.clear(); + } } public void addApplicationListenerBean(String listenerBeanName) { - this.defaultRetriever.applicationListenerBeans.add(listenerBeanName); + synchronized (this.defaultRetriever) { + this.defaultRetriever.applicationListenerBeans.add(listenerBeanName); + this.retrieverCache.clear(); + } } public void removeApplicationListener(ApplicationListener listener) { - this.defaultRetriever.applicationListeners.remove(listener); + synchronized (this.defaultRetriever) { + this.defaultRetriever.applicationListeners.remove(listener); + this.retrieverCache.clear(); + } } public void removeApplicationListenerBean(String listenerBeanName) { - this.defaultRetriever.applicationListenerBeans.remove(listenerBeanName); + synchronized (this.defaultRetriever) { + this.defaultRetriever.applicationListenerBeans.remove(listenerBeanName); + this.retrieverCache.clear(); + } } public void removeAllListeners() { - this.defaultRetriever.applicationListeners.clear(); - this.defaultRetriever.applicationListenerBeans.clear(); + synchronized (this.defaultRetriever) { + this.defaultRetriever.applicationListeners.clear(); + this.defaultRetriever.applicationListenerBeans.clear(); + this.retrieverCache.clear(); + } } public final void setBeanFactory(BeanFactory beanFactory) { @@ -120,24 +135,26 @@ public abstract class AbstractApplicationEventMulticaster implements Application else { retriever = new ListenerRetriever(); LinkedList allListeners = new LinkedList(); - for (ApplicationListener listener : this.defaultRetriever.applicationListeners) { - if (supportsEvent(listener, eventType, sourceType)) { - retriever.applicationListeners.add(listener); - allListeners.add(listener); - } - } - if (!this.defaultRetriever.applicationListenerBeans.isEmpty()) { - BeanFactory beanFactory = getBeanFactory(); - for (String listenerBeanName : this.defaultRetriever.applicationListenerBeans) { - ApplicationListener listener = beanFactory.getBean(listenerBeanName, ApplicationListener.class); + synchronized (this.defaultRetriever) { + for (ApplicationListener listener : this.defaultRetriever.applicationListeners) { if (supportsEvent(listener, eventType, sourceType)) { - retriever.applicationListenerBeans.add(listenerBeanName); + retriever.applicationListeners.add(listener); allListeners.add(listener); } } + if (!this.defaultRetriever.applicationListenerBeans.isEmpty()) { + BeanFactory beanFactory = getBeanFactory(); + for (String listenerBeanName : this.defaultRetriever.applicationListenerBeans) { + ApplicationListener listener = beanFactory.getBean(listenerBeanName, ApplicationListener.class); + if (supportsEvent(listener, eventType, sourceType)) { + retriever.applicationListenerBeans.add(listenerBeanName); + allListeners.add(listener); + } + } + OrderComparator.sort(allListeners); + this.retrieverCache.put(cacheKey, retriever); + } } - OrderComparator.sort(allListeners); - this.retrieverCache.put(cacheKey, retriever); return allListeners; } }