From 9063e66c5d114855e46b910ab33ae2276fe2bdc2 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Sat, 29 Sep 2018 17:15:53 +0200 Subject: [PATCH] AbstractApplicationEventMulticaster pre-sorts singleton listeners Issue: SPR-17307 --- .../AbstractApplicationEventMulticaster.java | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/spring-context/src/main/java/org/springframework/context/event/AbstractApplicationEventMulticaster.java b/spring-context/src/main/java/org/springframework/context/event/AbstractApplicationEventMulticaster.java index 73fa12f2942..5cd93850274 100644 --- a/spring-context/src/main/java/org/springframework/context/event/AbstractApplicationEventMulticaster.java +++ b/spring-context/src/main/java/org/springframework/context/event/AbstractApplicationEventMulticaster.java @@ -239,7 +239,12 @@ public abstract class AbstractApplicationEventMulticaster beanFactory.getBean(listenerBeanName, ApplicationListener.class); if (!allListeners.contains(listener) && supportsEvent(listener, eventType, sourceType)) { if (retriever != null) { - retriever.applicationListenerBeans.add(listenerBeanName); + if (beanFactory.isSingleton(listenerBeanName)) { + retriever.applicationListeners.add(listener); + } + else { + retriever.applicationListenerBeans.add(listenerBeanName); + } } allListeners.add(listener); } @@ -252,6 +257,10 @@ public abstract class AbstractApplicationEventMulticaster } } AnnotationAwareOrderComparator.sort(allListeners); + if (retriever != null && retriever.applicationListenerBeans.isEmpty()) { + retriever.applicationListeners.clear(); + retriever.applicationListeners.addAll(allListeners); + } return allListeners; } @@ -356,15 +365,13 @@ public abstract class AbstractApplicationEventMulticaster */ private class ListenerRetriever { - public final Set> applicationListeners; + public final Set> applicationListeners = new LinkedHashSet<>(); - public final Set applicationListenerBeans; + public final Set applicationListenerBeans = new LinkedHashSet<>(); private final boolean preFiltered; public ListenerRetriever(boolean preFiltered) { - this.applicationListeners = new LinkedHashSet<>(); - this.applicationListenerBeans = new LinkedHashSet<>(); this.preFiltered = preFiltered; } @@ -387,7 +394,9 @@ public abstract class AbstractApplicationEventMulticaster } } } - AnnotationAwareOrderComparator.sort(allListeners); + if (!this.preFiltered || !this.applicationListenerBeans.isEmpty()) { + AnnotationAwareOrderComparator.sort(allListeners); + } return allListeners; } }