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,8 +239,13 @@ public abstract class AbstractApplicationEventMulticaster
beanFactory.getBean(listenerBeanName, ApplicationListener.class);
if (!allListeners.contains(listener) && supportsEvent(listener, eventType, sourceType)) {
if (retriever != null) {
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<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;
public ListenerRetriever(boolean preFiltered) {
this.applicationListeners = new LinkedHashSet<>();
this.applicationListenerBeans = new LinkedHashSet<>();
this.preFiltered = preFiltered;
}
@ -387,7 +394,9 @@ public abstract class AbstractApplicationEventMulticaster
}
}
}
if (!this.preFiltered || !this.applicationListenerBeans.isEmpty()) {
AnnotationAwareOrderComparator.sort(allListeners);
}
return allListeners;
}
}