AbstractApplicationEventMulticaster pre-sorts singleton listeners

Issue: SPR-17307
This commit is contained in:
Juergen Hoeller 2018-09-29 17:15:53 +02:00
parent d6dfde3e5b
commit 9063e66c5d
1 changed files with 15 additions and 6 deletions

View File

@ -239,7 +239,12 @@ public abstract class AbstractApplicationEventMulticaster
beanFactory.getBean(listenerBeanName, ApplicationListener.class); beanFactory.getBean(listenerBeanName, ApplicationListener.class);
if (!allListeners.contains(listener) && supportsEvent(listener, eventType, sourceType)) { if (!allListeners.contains(listener) && supportsEvent(listener, eventType, sourceType)) {
if (retriever != null) { if (retriever != null) {
retriever.applicationListenerBeans.add(listenerBeanName); if (beanFactory.isSingleton(listenerBeanName)) {
retriever.applicationListeners.add(listener);
}
else {
retriever.applicationListenerBeans.add(listenerBeanName);
}
} }
allListeners.add(listener); allListeners.add(listener);
} }
@ -252,6 +257,10 @@ public abstract class AbstractApplicationEventMulticaster
} }
} }
AnnotationAwareOrderComparator.sort(allListeners); AnnotationAwareOrderComparator.sort(allListeners);
if (retriever != null && retriever.applicationListenerBeans.isEmpty()) {
retriever.applicationListeners.clear();
retriever.applicationListeners.addAll(allListeners);
}
return allListeners; return allListeners;
} }
@ -356,15 +365,13 @@ public abstract class AbstractApplicationEventMulticaster
*/ */
private class ListenerRetriever { private class ListenerRetriever {
public final Set<ApplicationListener<?>> applicationListeners; public final Set<ApplicationListener<?>> applicationListeners = new LinkedHashSet<>();
public final Set<String> applicationListenerBeans; public final Set<String> applicationListenerBeans = new LinkedHashSet<>();
private final boolean preFiltered; private final boolean preFiltered;
public ListenerRetriever(boolean preFiltered) { public ListenerRetriever(boolean preFiltered) {
this.applicationListeners = new LinkedHashSet<>();
this.applicationListenerBeans = new LinkedHashSet<>();
this.preFiltered = preFiltered; 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; return allListeners;
} }
} }