From b7b2a259537a1e7a0862c2a5b1d29342bb310c99 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Fri, 1 Oct 2010 22:16:21 +0000 Subject: [PATCH] fixed ApplicationContext event processing for repeated invocations to non-singleton listener beans (SPR-7563) --- .../AbstractApplicationEventMulticaster.java | 2 +- .../event/ApplicationContextEventTests.java | 45 ++++++++++++++++++- 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/org.springframework.context/src/main/java/org/springframework/context/event/AbstractApplicationEventMulticaster.java b/org.springframework.context/src/main/java/org/springframework/context/event/AbstractApplicationEventMulticaster.java index fc3a5a728a9..0ff7a78d46d 100644 --- a/org.springframework.context/src/main/java/org/springframework/context/event/AbstractApplicationEventMulticaster.java +++ b/org.springframework.context/src/main/java/org/springframework/context/event/AbstractApplicationEventMulticaster.java @@ -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); } } diff --git a/org.springframework.context/src/test/java/org/springframework/context/event/ApplicationContextEventTests.java b/org.springframework.context/src/test/java/org/springframework/context/event/ApplicationContextEventTests.java index 06c598c9e76..9baa31dc2f2 100644 --- a/org.springframework.context/src/test/java/org/springframework/context/event/ApplicationContextEventTests.java +++ b/org.springframework.context/src/test/java/org/springframework/context/event/ApplicationContextEventTests.java @@ -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 { 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 { } } + + public static class MyNonSingletonListener implements ApplicationListener { + + public static final Set seenEvents = new HashSet(); + + public void onApplicationEvent(ApplicationEvent event) { + seenEvents.add(event); + } + } + }