filter for duplicate listeners in "getApplicationListeners()" as well (SPR-7204)
This commit is contained in:
@@ -45,12 +45,12 @@ import org.springframework.core.OrderComparator;
|
|||||||
*
|
*
|
||||||
* @author Juergen Hoeller
|
* @author Juergen Hoeller
|
||||||
* @since 1.2.3
|
* @since 1.2.3
|
||||||
* @see #getApplicationListeners()
|
* @see #getApplicationListeners(ApplicationEvent)
|
||||||
* @see SimpleApplicationEventMulticaster
|
* @see SimpleApplicationEventMulticaster
|
||||||
*/
|
*/
|
||||||
public abstract class AbstractApplicationEventMulticaster implements ApplicationEventMulticaster, BeanFactoryAware {
|
public abstract class AbstractApplicationEventMulticaster implements ApplicationEventMulticaster, BeanFactoryAware {
|
||||||
|
|
||||||
private final ListenerRetriever defaultRetriever = new ListenerRetriever();
|
private final ListenerRetriever defaultRetriever = new ListenerRetriever(false);
|
||||||
|
|
||||||
private final Map<ListenerCacheKey, ListenerRetriever> retrieverCache =
|
private final Map<ListenerCacheKey, ListenerRetriever> retrieverCache =
|
||||||
new ConcurrentHashMap<ListenerCacheKey, ListenerRetriever>();
|
new ConcurrentHashMap<ListenerCacheKey, ListenerRetriever>();
|
||||||
@@ -133,7 +133,7 @@ public abstract class AbstractApplicationEventMulticaster implements Application
|
|||||||
return retriever.getApplicationListeners();
|
return retriever.getApplicationListeners();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
retriever = new ListenerRetriever();
|
retriever = new ListenerRetriever(true);
|
||||||
LinkedList<ApplicationListener> allListeners = new LinkedList<ApplicationListener>();
|
LinkedList<ApplicationListener> allListeners = new LinkedList<ApplicationListener>();
|
||||||
synchronized (this.defaultRetriever) {
|
synchronized (this.defaultRetriever) {
|
||||||
for (ApplicationListener listener : this.defaultRetriever.applicationListeners) {
|
for (ApplicationListener listener : this.defaultRetriever.applicationListeners) {
|
||||||
@@ -221,9 +221,12 @@ public abstract class AbstractApplicationEventMulticaster implements Application
|
|||||||
|
|
||||||
public final Set<String> applicationListenerBeans;
|
public final Set<String> applicationListenerBeans;
|
||||||
|
|
||||||
public ListenerRetriever() {
|
private final boolean preFiltered;
|
||||||
|
|
||||||
|
public ListenerRetriever(boolean preFiltered) {
|
||||||
this.applicationListeners = new LinkedHashSet<ApplicationListener>();
|
this.applicationListeners = new LinkedHashSet<ApplicationListener>();
|
||||||
this.applicationListenerBeans = new LinkedHashSet<String>();
|
this.applicationListenerBeans = new LinkedHashSet<String>();
|
||||||
|
this.preFiltered = preFiltered;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Collection<ApplicationListener> getApplicationListeners() {
|
public Collection<ApplicationListener> getApplicationListeners() {
|
||||||
@@ -235,7 +238,9 @@ public abstract class AbstractApplicationEventMulticaster implements Application
|
|||||||
BeanFactory beanFactory = getBeanFactory();
|
BeanFactory beanFactory = getBeanFactory();
|
||||||
for (String listenerBeanName : this.applicationListenerBeans) {
|
for (String listenerBeanName : this.applicationListenerBeans) {
|
||||||
ApplicationListener listener = beanFactory.getBean(listenerBeanName, ApplicationListener.class);
|
ApplicationListener listener = beanFactory.getBean(listenerBeanName, ApplicationListener.class);
|
||||||
allListeners.add(listener);
|
if (!this.preFiltered && !allListeners.contains(listener)) {
|
||||||
|
allListeners.add(listener);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
OrderComparator.sort(allListeners);
|
OrderComparator.sort(allListeners);
|
||||||
|
|||||||
Reference in New Issue
Block a user