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 8a1bd763f0..fc3a5a728a 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 @@ -45,12 +45,12 @@ import org.springframework.core.OrderComparator; * * @author Juergen Hoeller * @since 1.2.3 - * @see #getApplicationListeners() + * @see #getApplicationListeners(ApplicationEvent) * @see SimpleApplicationEventMulticaster */ public abstract class AbstractApplicationEventMulticaster implements ApplicationEventMulticaster, BeanFactoryAware { - private final ListenerRetriever defaultRetriever = new ListenerRetriever(); + private final ListenerRetriever defaultRetriever = new ListenerRetriever(false); private final Map retrieverCache = new ConcurrentHashMap(); @@ -133,7 +133,7 @@ public abstract class AbstractApplicationEventMulticaster implements Application return retriever.getApplicationListeners(); } else { - retriever = new ListenerRetriever(); + retriever = new ListenerRetriever(true); LinkedList allListeners = new LinkedList(); synchronized (this.defaultRetriever) { for (ApplicationListener listener : this.defaultRetriever.applicationListeners) { @@ -221,9 +221,12 @@ public abstract class AbstractApplicationEventMulticaster implements Application public final Set applicationListenerBeans; - public ListenerRetriever() { + private final boolean preFiltered; + + public ListenerRetriever(boolean preFiltered) { this.applicationListeners = new LinkedHashSet(); this.applicationListenerBeans = new LinkedHashSet(); + this.preFiltered = preFiltered; } public Collection getApplicationListeners() { @@ -235,7 +238,9 @@ public abstract class AbstractApplicationEventMulticaster implements Application BeanFactory beanFactory = getBeanFactory(); for (String listenerBeanName : this.applicationListenerBeans) { ApplicationListener listener = beanFactory.getBean(listenerBeanName, ApplicationListener.class); - allListeners.add(listener); + if (!this.preFiltered && !allListeners.contains(listener)) { + allListeners.add(listener); + } } } OrderComparator.sort(allListeners);