reset retriever cache when adding/removing listeners (SPR-6624)
This commit is contained in:
parent
f7b0a2c0a2
commit
e5d4ffc166
|
|
@ -59,24 +59,39 @@ public abstract class AbstractApplicationEventMulticaster implements Application
|
||||||
|
|
||||||
|
|
||||||
public void addApplicationListener(ApplicationListener listener) {
|
public void addApplicationListener(ApplicationListener listener) {
|
||||||
this.defaultRetriever.applicationListeners.add(listener);
|
synchronized (this.defaultRetriever) {
|
||||||
|
this.defaultRetriever.applicationListeners.add(listener);
|
||||||
|
this.retrieverCache.clear();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addApplicationListenerBean(String listenerBeanName) {
|
public void addApplicationListenerBean(String listenerBeanName) {
|
||||||
this.defaultRetriever.applicationListenerBeans.add(listenerBeanName);
|
synchronized (this.defaultRetriever) {
|
||||||
|
this.defaultRetriever.applicationListenerBeans.add(listenerBeanName);
|
||||||
|
this.retrieverCache.clear();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void removeApplicationListener(ApplicationListener listener) {
|
public void removeApplicationListener(ApplicationListener listener) {
|
||||||
this.defaultRetriever.applicationListeners.remove(listener);
|
synchronized (this.defaultRetriever) {
|
||||||
|
this.defaultRetriever.applicationListeners.remove(listener);
|
||||||
|
this.retrieverCache.clear();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void removeApplicationListenerBean(String listenerBeanName) {
|
public void removeApplicationListenerBean(String listenerBeanName) {
|
||||||
this.defaultRetriever.applicationListenerBeans.remove(listenerBeanName);
|
synchronized (this.defaultRetriever) {
|
||||||
|
this.defaultRetriever.applicationListenerBeans.remove(listenerBeanName);
|
||||||
|
this.retrieverCache.clear();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void removeAllListeners() {
|
public void removeAllListeners() {
|
||||||
this.defaultRetriever.applicationListeners.clear();
|
synchronized (this.defaultRetriever) {
|
||||||
this.defaultRetriever.applicationListenerBeans.clear();
|
this.defaultRetriever.applicationListeners.clear();
|
||||||
|
this.defaultRetriever.applicationListenerBeans.clear();
|
||||||
|
this.retrieverCache.clear();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public final void setBeanFactory(BeanFactory beanFactory) {
|
public final void setBeanFactory(BeanFactory beanFactory) {
|
||||||
|
|
@ -120,24 +135,26 @@ public abstract class AbstractApplicationEventMulticaster implements Application
|
||||||
else {
|
else {
|
||||||
retriever = new ListenerRetriever();
|
retriever = new ListenerRetriever();
|
||||||
LinkedList<ApplicationListener> allListeners = new LinkedList<ApplicationListener>();
|
LinkedList<ApplicationListener> allListeners = new LinkedList<ApplicationListener>();
|
||||||
for (ApplicationListener listener : this.defaultRetriever.applicationListeners) {
|
synchronized (this.defaultRetriever) {
|
||||||
if (supportsEvent(listener, eventType, sourceType)) {
|
for (ApplicationListener listener : this.defaultRetriever.applicationListeners) {
|
||||||
retriever.applicationListeners.add(listener);
|
|
||||||
allListeners.add(listener);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!this.defaultRetriever.applicationListenerBeans.isEmpty()) {
|
|
||||||
BeanFactory beanFactory = getBeanFactory();
|
|
||||||
for (String listenerBeanName : this.defaultRetriever.applicationListenerBeans) {
|
|
||||||
ApplicationListener listener = beanFactory.getBean(listenerBeanName, ApplicationListener.class);
|
|
||||||
if (supportsEvent(listener, eventType, sourceType)) {
|
if (supportsEvent(listener, eventType, sourceType)) {
|
||||||
retriever.applicationListenerBeans.add(listenerBeanName);
|
retriever.applicationListeners.add(listener);
|
||||||
allListeners.add(listener);
|
allListeners.add(listener);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (!this.defaultRetriever.applicationListenerBeans.isEmpty()) {
|
||||||
|
BeanFactory beanFactory = getBeanFactory();
|
||||||
|
for (String listenerBeanName : this.defaultRetriever.applicationListenerBeans) {
|
||||||
|
ApplicationListener listener = beanFactory.getBean(listenerBeanName, ApplicationListener.class);
|
||||||
|
if (supportsEvent(listener, eventType, sourceType)) {
|
||||||
|
retriever.applicationListenerBeans.add(listenerBeanName);
|
||||||
|
allListeners.add(listener);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
OrderComparator.sort(allListeners);
|
||||||
|
this.retrieverCache.put(cacheKey, retriever);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
OrderComparator.sort(allListeners);
|
|
||||||
this.retrieverCache.put(cacheKey, retriever);
|
|
||||||
return allListeners;
|
return allListeners;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue