From b4c6cef526c4ed1d1488c61b94a0a613a508b94e Mon Sep 17 00:00:00 2001 From: artsiom Date: Fri, 14 Sep 2018 23:14:48 +0300 Subject: [PATCH 1/2] Publish ApplicationContextInitializedEvent on contextPrepared See gh-14478 --- .../ApplicationContextInitializedEvent.java | 55 +++++++++++++++++++ .../event/EventPublishingRunListener.java | 4 +- .../boot/SpringApplicationTests.java | 6 ++ 3 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/event/ApplicationContextInitializedEvent.java 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 0000000000..82bdcfbe22 --- /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 6468222163..902495b4ef 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 8fd562e5f9..b249eed191 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); } } From 5e0e9416325cbe6251db76d2bcc2249c94eaf9b5 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Mon, 17 Sep 2018 10:50:28 +0100 Subject: [PATCH 2/2] Polish "Publish ApplicationContextInitializedEvent on contextPrepared" Closes gh-14478 --- .../context/event/ApplicationContextInitializedEvent.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 index 82bdcfbe22..dd88bbfb05 100644 --- 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 @@ -36,7 +36,7 @@ public class ApplicationContextInitializedEvent extends SpringApplicationEvent { * 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) + * @param context the context that has been initialized */ public ApplicationContextInitializedEvent(SpringApplication application, String[] args, ConfigurableApplicationContext context) { @@ -48,7 +48,7 @@ public class ApplicationContextInitializedEvent extends SpringApplicationEvent { * Return the application context. * @return the context */ - public ConfigurableApplicationContext getContext() { + public ConfigurableApplicationContext getApplicationContext() { return this.context; }