Browse Source

AbstractApplicationEventMulticaster pre-sorts singleton listeners

Issue: SPR-17307
pull/1970/head
Juergen Hoeller 8 years ago
parent
commit
9063e66c5d
  1. 21
      spring-context/src/main/java/org/springframework/context/event/AbstractApplicationEventMulticaster.java

21
spring-context/src/main/java/org/springframework/context/event/AbstractApplicationEventMulticaster.java

@ -239,7 +239,12 @@ public abstract class AbstractApplicationEventMulticaster @@ -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 @@ -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 @@ -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 @@ -387,7 +394,9 @@ public abstract class AbstractApplicationEventMulticaster
}
}
}
AnnotationAwareOrderComparator.sort(allListeners);
if (!this.preFiltered || !this.applicationListenerBeans.isEmpty()) {
AnnotationAwareOrderComparator.sort(allListeners);
}
return allListeners;
}
}

Loading…
Cancel
Save