Browse Source

fixed ApplicationContext event processing for repeated invocations to non-singleton listener beans (SPR-7563)

3.0.x
Juergen Hoeller 15 years ago
parent
commit
b7b2a25953
  1. 2
      org.springframework.context/src/main/java/org/springframework/context/event/AbstractApplicationEventMulticaster.java
  2. 45
      org.springframework.context/src/test/java/org/springframework/context/event/ApplicationContextEventTests.java

2
org.springframework.context/src/main/java/org/springframework/context/event/AbstractApplicationEventMulticaster.java

@ -238,7 +238,7 @@ public abstract class AbstractApplicationEventMulticaster implements Application @@ -238,7 +238,7 @@ public abstract class AbstractApplicationEventMulticaster implements Application
BeanFactory beanFactory = getBeanFactory();
for (String listenerBeanName : this.applicationListenerBeans) {
ApplicationListener listener = beanFactory.getBean(listenerBeanName, ApplicationListener.class);
if (!this.preFiltered && !allListeners.contains(listener)) {
if (this.preFiltered || !allListeners.contains(listener)) {
allListeners.add(listener);
}
}

45
org.springframework.context/src/test/java/org/springframework/context/event/ApplicationContextEventTests.java

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
/*
* Copyright 2002-2009 the original author or authors.
* Copyright 2002-2010 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -127,6 +127,39 @@ public class ApplicationContextEventTests { @@ -127,6 +127,39 @@ public class ApplicationContextEventTests {
assertTrue(listener1.seenEvents.contains(event2));
assertTrue(listener1.seenEvents.contains(event3));
assertTrue(listener1.seenEvents.contains(event4));
listener1.seenEvents.clear();
context.publishEvent(event1);
context.publishEvent(event2);
context.publishEvent(event3);
context.publishEvent(event4);
assertTrue(listener1.seenEvents.contains(event1));
assertTrue(listener1.seenEvents.contains(event2));
assertTrue(listener1.seenEvents.contains(event3));
assertTrue(listener1.seenEvents.contains(event4));
}
@Test
public void nonSingletonListenerInApplicationContext() {
StaticApplicationContext context = new StaticApplicationContext();
RootBeanDefinition listener = new RootBeanDefinition(MyNonSingletonListener.class);
listener.setScope(RootBeanDefinition.SCOPE_PROTOTYPE);
context.registerBeanDefinition("listener", listener);
context.refresh();
MyEvent event1 = new MyEvent(context);
context.publishEvent(event1);
MyOtherEvent event2 = new MyOtherEvent(context);
context.publishEvent(event2);
MyEvent event3 = new MyEvent(context);
context.publishEvent(event3);
MyOtherEvent event4 = new MyOtherEvent(context);
context.publishEvent(event4);
assertTrue(MyNonSingletonListener.seenEvents.contains(event1));
assertTrue(MyNonSingletonListener.seenEvents.contains(event2));
assertTrue(MyNonSingletonListener.seenEvents.contains(event3));
assertTrue(MyNonSingletonListener.seenEvents.contains(event4));
MyNonSingletonListener.seenEvents.clear();
}
@Test
@ -212,4 +245,14 @@ public class ApplicationContextEventTests { @@ -212,4 +245,14 @@ public class ApplicationContextEventTests {
}
}
public static class MyNonSingletonListener implements ApplicationListener {
public static final Set<ApplicationEvent> seenEvents = new HashSet<ApplicationEvent>();
public void onApplicationEvent(ApplicationEvent event) {
seenEvents.add(event);
}
}
}

Loading…
Cancel
Save