diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/event/ApplicationContextInitializedEvent.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/event/ApplicationContextInitializedEvent.java new file mode 100644 index 00000000000..82bdcfbe222 --- /dev/null +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/event/ApplicationContextInitializedEvent.java @@ -0,0 +1,55 @@ +/* + * Copyright 2012-2018 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.context.event; + +import org.springframework.boot.SpringApplication; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ConfigurableApplicationContext; + +/** + * Event published when a {@link SpringApplication} is starting up and the + * {@link ApplicationContext} is prepared and ApplicationContextInitializers have been + * called but before any bean definitions are loaded. + * + * @author Artsiom Yudovin + */ +@SuppressWarnings("serial") +public class ApplicationContextInitializedEvent extends SpringApplicationEvent { + + private final ConfigurableApplicationContext context; + + /** + * Create a new {@link ApplicationContextInitializedEvent} instance. + * @param application the current application + * @param args the arguments the application is running with + * @param context the context that was being created (maybe null) + */ + public ApplicationContextInitializedEvent(SpringApplication application, + String[] args, ConfigurableApplicationContext context) { + super(application, args); + this.context = context; + } + + /** + * Return the application context. + * @return the context + */ + public ConfigurableApplicationContext getContext() { + return this.context; + } + +} diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/event/EventPublishingRunListener.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/event/EventPublishingRunListener.java index 6468222163d..902495b4ef3 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/event/EventPublishingRunListener.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/event/EventPublishingRunListener.java @@ -40,6 +40,7 @@ import org.springframework.util.ErrorHandler; * @author Phillip Webb * @author Stephane Nicoll * @author Andy Wilkinson + * @author Artsiom Yudovin */ public class EventPublishingRunListener implements SpringApplicationRunListener, Ordered { @@ -77,7 +78,8 @@ public class EventPublishingRunListener implements SpringApplicationRunListener, @Override public void contextPrepared(ConfigurableApplicationContext context) { - + this.initialMulticaster.multicastEvent(new ApplicationContextInitializedEvent( + this.application, this.args, context)); } @Override diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/SpringApplicationTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/SpringApplicationTests.java index 8fd562e5f94..b249eed191b 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/SpringApplicationTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/SpringApplicationTests.java @@ -49,6 +49,7 @@ import org.springframework.beans.factory.support.BeanDefinitionOverrideException import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.BeanNameGenerator; import org.springframework.beans.factory.support.DefaultBeanNameGenerator; +import org.springframework.boot.context.event.ApplicationContextInitializedEvent; import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent; import org.springframework.boot.context.event.ApplicationFailedEvent; import org.springframework.boot.context.event.ApplicationPreparedEvent; @@ -125,6 +126,7 @@ import static org.mockito.Mockito.verifyNoMoreInteractions; * @author Craig Burke * @author Madhura Bhave * @author Brian Clozel + * @author Artsiom Yudovin */ public class SpringApplicationTests { @@ -383,6 +385,8 @@ public class SpringApplicationTests { inOrder.verify(listener).onApplicationEvent(isA(ApplicationStartingEvent.class)); inOrder.verify(listener) .onApplicationEvent(isA(ApplicationEnvironmentPreparedEvent.class)); + inOrder.verify(listener) + .onApplicationEvent(isA(ApplicationContextInitializedEvent.class)); inOrder.verify(listener).onApplicationEvent(isA(ApplicationPreparedEvent.class)); inOrder.verify(listener).onApplicationEvent(isA(ContextRefreshedEvent.class)); inOrder.verify(listener).onApplicationEvent(isA(ApplicationStartedEvent.class)); @@ -1000,6 +1004,7 @@ public class SpringApplicationTests { catch (ApplicationContextException ex) { verifyListenerEvents(listener, ApplicationStartingEvent.class, ApplicationEnvironmentPreparedEvent.class, + ApplicationContextInitializedEvent.class, ApplicationPreparedEvent.class, ApplicationFailedEvent.class); } } @@ -1019,6 +1024,7 @@ public class SpringApplicationTests { catch (BeanCreationException ex) { verifyListenerEvents(listener, ApplicationStartingEvent.class, ApplicationEnvironmentPreparedEvent.class, + ApplicationContextInitializedEvent.class, ApplicationPreparedEvent.class, ApplicationFailedEvent.class); } }