Re-register SpringApplication listeners in context once it is available

Fixes gh-1141
This commit is contained in:
Dave Syer 2014-06-24 11:18:14 +01:00
parent b2db3790de
commit d2b88d741c
2 changed files with 54 additions and 0 deletions

View File

@ -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) {

View File

@ -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<ApplicationEvent> events = new LinkedHashSet<ApplicationEvent>();
application.addListeners(new ApplicationListener<ApplicationEvent>() {
@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<ApplicationEvent> events = new LinkedHashSet<ApplicationEvent>();
application.addListeners(new ApplicationListener<ApplicationEvent>() {
@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 {