diff --git a/spring-boot/src/main/java/org/springframework/boot/context/web/ServletContextApplicationListener.java b/spring-boot/src/main/java/org/springframework/boot/context/web/ServletContextApplicationListener.java new file mode 100644 index 0000000000..397eb1373d --- /dev/null +++ b/spring-boot/src/main/java/org/springframework/boot/context/web/ServletContextApplicationListener.java @@ -0,0 +1,56 @@ +/* + * Copyright 2012-2016 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.web; + +import javax.servlet.ServletContext; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.context.config.ConfigFileApplicationListener; +import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent; +import org.springframework.context.ApplicationListener; +import org.springframework.core.Ordered; +import org.springframework.web.context.ConfigurableWebEnvironment; + +/** + * An {@link ApplicationListener} that initializes the {@link SpringApplication} using the + * {@link ServletContext}. + * + * @author Andy Wilkinson + */ +final class ServletContextApplicationListener + implements ApplicationListener, Ordered { + + private final ServletContext servletContext; + + ServletContextApplicationListener(ServletContext servletContext) { + this.servletContext = servletContext; + } + + @Override + public int getOrder() { + return ConfigFileApplicationListener.DEFAULT_ORDER - 1; + } + + @Override + public void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) { + if (event.getEnvironment() instanceof ConfigurableWebEnvironment) { + ((ConfigurableWebEnvironment) event.getEnvironment()) + .initPropertySources(this.servletContext, null); + } + } + +} diff --git a/spring-boot/src/main/java/org/springframework/boot/context/web/SpringBootServletInitializer.java b/spring-boot/src/main/java/org/springframework/boot/context/web/SpringBootServletInitializer.java index 39221005b1..d89d4d5c96 100644 --- a/spring-boot/src/main/java/org/springframework/boot/context/web/SpringBootServletInitializer.java +++ b/spring-boot/src/main/java/org/springframework/boot/context/web/SpringBootServletInitializer.java @@ -112,6 +112,7 @@ public abstract class SpringBootServletInitializer implements WebApplicationInit } builder.initializers( new ServletContextApplicationContextInitializer(servletContext)); + builder.listeners(new ServletContextApplicationListener(servletContext)); builder.contextClass(AnnotationConfigEmbeddedWebApplicationContext.class); builder = configure(builder); SpringApplication application = builder.build(); diff --git a/spring-boot/src/test/java/org/springframework/boot/context/web/SpringBootServletInitializerTests.java b/spring-boot/src/test/java/org/springframework/boot/context/web/SpringBootServletInitializerTests.java index 7cb85aacad..407a864dbc 100644 --- a/spring-boot/src/test/java/org/springframework/boot/context/web/SpringBootServletInitializerTests.java +++ b/spring-boot/src/test/java/org/springframework/boot/context/web/SpringBootServletInitializerTests.java @@ -30,11 +30,14 @@ import org.junit.rules.ExpectedException; import org.springframework.beans.DirectFieldAccessor; import org.springframework.boot.SpringApplication; import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.context.ApplicationListener; import org.springframework.context.annotation.Configuration; import org.springframework.mock.web.MockServletContext; import org.springframework.web.context.WebApplicationContext; 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.junit.Assert.assertThat; @@ -102,6 +105,14 @@ public class SpringBootServletInitializerTests { equalToSet(WithErrorPageFilterNotRegistered.class)); } + @Test + public void servletContextApplicationListenerIsAdded() { + new WithConfiguredSource().createRootApplicationContext(this.servletContext); + assertThat(this.application.getListeners(), + hasItem((Matcher>) instanceOf( + ServletContextApplicationListener.class))); + } + private Matcher> equalToSet(Object... items) { Set set = new LinkedHashSet(); Collections.addAll(set, items);