From d2b88d741cd943bbfc5ccb7850e75c25d6ade14b Mon Sep 17 00:00:00 2001 From: Dave Syer Date: Tue, 24 Jun 2014 11:18:14 +0100 Subject: [PATCH] Re-register SpringApplication listeners in context once it is available Fixes gh-1141 --- .../event/EventPublishingRunListener.java | 5 ++ .../boot/SpringApplicationTests.java | 49 +++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/spring-boot/src/main/java/org/springframework/boot/context/event/EventPublishingRunListener.java b/spring-boot/src/main/java/org/springframework/boot/context/event/EventPublishingRunListener.java index 9414d470728..96240c4622c 100644 --- a/spring-boot/src/main/java/org/springframework/boot/context/event/EventPublishingRunListener.java +++ b/spring-boot/src/main/java/org/springframework/boot/context/event/EventPublishingRunListener.java @@ -77,6 +77,9 @@ public class EventPublishingRunListener implements SpringApplicationRunListener @Override public void contextLoaded(ConfigurableApplicationContext context) { + for (ApplicationListener listener : this.application.getListeners()) { + context.addApplicationListener(listener); + } publishEvent(new ApplicationPreparedEvent(this.application, this.args, context)); } @@ -86,6 +89,8 @@ public class EventPublishingRunListener implements SpringApplicationRunListener publishEvent(new ApplicationFailedEvent(this.application, this.args, context, exception)); } + else { + } } private void publishEvent(SpringApplicationEvent event) { diff --git a/spring-boot/src/test/java/org/springframework/boot/SpringApplicationTests.java b/spring-boot/src/test/java/org/springframework/boot/SpringApplicationTests.java index a76d771ca37..578997c6f63 100644 --- a/spring-boot/src/test/java/org/springframework/boot/SpringApplicationTests.java +++ b/spring-boot/src/test/java/org/springframework/boot/SpringApplicationTests.java @@ -18,6 +18,7 @@ package org.springframework.boot; import java.util.Arrays; import java.util.Collections; +import java.util.LinkedHashSet; import java.util.Set; import java.util.concurrent.atomic.AtomicReference; @@ -31,9 +32,11 @@ import org.springframework.beans.factory.support.BeanNameGenerator; import org.springframework.beans.factory.support.DefaultBeanNameGenerator; import org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext; import org.springframework.boot.context.embedded.jetty.JettyEmbeddedServletContainerFactory; +import org.springframework.boot.context.event.ApplicationPreparedEvent; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.context.ApplicationContextInitializer; +import org.springframework.context.ApplicationEvent; import org.springframework.context.ApplicationListener; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; @@ -41,6 +44,7 @@ import org.springframework.context.annotation.AnnotationConfigUtils; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.event.ContextRefreshedEvent; +import org.springframework.context.event.SimpleApplicationEventMulticaster; import org.springframework.context.support.StaticApplicationContext; import org.springframework.core.Ordered; import org.springframework.core.env.CommandLinePropertySource; @@ -55,8 +59,10 @@ import org.springframework.core.io.ResourceLoader; import org.springframework.util.StringUtils; import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.hasItem; import static org.hamcrest.Matchers.instanceOf; import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.isA; import static org.hamcrest.Matchers.sameInstance; import static org.hamcrest.Matchers.startsWith; import static org.junit.Assert.assertArrayEquals; @@ -436,6 +442,39 @@ public class SpringApplicationTests { verify(applicationContext.getApplicationContext()).registerShutdownHook(); } + @Test + public void registerListener() throws Exception { + SpringApplication application = new SpringApplication(ExampleConfig.class); + application.setApplicationContextClass(SpyApplicationContext.class); + final LinkedHashSet events = new LinkedHashSet(); + application.addListeners(new ApplicationListener() { + @Override + public void onApplicationEvent(ApplicationEvent event) { + events.add(event); + } + }); + this.context = application.run(); + assertThat(events, hasItem(isA(ApplicationPreparedEvent.class))); + assertThat(events, hasItem(isA(ContextRefreshedEvent.class))); + } + + @Test + public void registerListenerWithCustomMulticaster() throws Exception { + SpringApplication application = new SpringApplication(ExampleConfig.class, + Multicaster.class); + application.setApplicationContextClass(SpyApplicationContext.class); + final LinkedHashSet events = new LinkedHashSet(); + application.addListeners(new ApplicationListener() { + @Override + public void onApplicationEvent(ApplicationEvent event) { + events.add(event); + } + }); + this.context = application.run(); + assertThat(events, hasItem(isA(ApplicationPreparedEvent.class))); + assertThat(events, hasItem(isA(ContextRefreshedEvent.class))); + } + @Test public void registerShutdownHookOff() throws Exception { SpringApplication application = new SpringApplication(ExampleConfig.class); @@ -551,6 +590,16 @@ public class SpringApplicationTests { } + @Configuration + static class Multicaster { + + @Bean + public SimpleApplicationEventMulticaster applicationEventMulticaster() { + return new SimpleApplicationEventMulticaster(); + } + + } + @Configuration static class ExampleWebConfig {