From e5d4ffc166cf1bf2f1b9ce97d09761b02878d119 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Tue, 5 Jan 2010 13:09:03 +0000 Subject: [PATCH] reset retriever cache when adding/removing listeners (SPR-6624) --- .../AbstractApplicationEventMulticaster.java | 55 ++++++++++++------- 1 file changed, 36 insertions(+), 19 deletions(-) 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; } }