diff --git a/spring-boot/src/main/java/org/springframework/boot/SpringApplication.java b/spring-boot/src/main/java/org/springframework/boot/SpringApplication.java
index 2645315ab3..83a43959b3 100644
--- a/spring-boot/src/main/java/org/springframework/boot/SpringApplication.java
+++ b/spring-boot/src/main/java/org/springframework/boot/SpringApplication.java
@@ -296,7 +296,7 @@ public class SpringApplication {
}
private void callNonEnvironmentAwareSpringApplicationInitializers(String[] args) {
- for (ApplicationContextInitializer> initializer : this.initializers) {
+ for (ApplicationContextInitializer> initializer : getInitializers()) {
if (initializer instanceof SpringApplicationInitializer
&& !(initializer instanceof EnvironmentAware)) {
((SpringApplicationInitializer) initializer).initialize(this, args);
@@ -334,7 +334,7 @@ public class SpringApplication {
private void callEnvironmentAwareSpringApplicationInitializers(String[] args,
ConfigurableEnvironment environment) {
- for (ApplicationContextInitializer> initializer : this.initializers) {
+ for (ApplicationContextInitializer> initializer : getInitializers()) {
if (initializer instanceof SpringApplicationInitializer
&& initializer instanceof EnvironmentAware) {
((EnvironmentAware) initializer).setEnvironment(environment);
@@ -360,7 +360,7 @@ public class SpringApplication {
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
protected void applyInitializers(ConfigurableApplicationContext context) {
- for (ApplicationContextInitializer initializer : this.initializers) {
+ for (ApplicationContextInitializer initializer : getInitializers()) {
Class> requiredType = GenericTypeResolver.resolveTypeArgument(
initializer.getClass(), ApplicationContextInitializer.class);
Assert.isInstanceOf(requiredType, context, "Unable to call initializer.");
@@ -634,7 +634,9 @@ public class SpringApplication {
/**
* Sets the {@link ApplicationContextInitializer} that will be applied to the Spring
- * {@link ApplicationContext}. Any existing initializers will be replaced.
+ * {@link ApplicationContext}. Any existing initializers will be replaced. The default
+ * initializers (from META-INF/spring.factories are always appended at
+ * runtime).
* @param initializers the initializers to set
*/
public void setInitializers(
@@ -648,7 +650,10 @@ public class SpringApplication {
* @return the initializers
*/
public List> getInitializers() {
- return this.initializers;
+ List> initializers = new ArrayList>(
+ this.initializers);
+ initializers.addAll(getSpringFactoriesApplicationContextInitializers());
+ return initializers;
}
/**
diff --git a/spring-boot/src/main/java/org/springframework/boot/builder/SpringApplicationBuilder.java b/spring-boot/src/main/java/org/springframework/boot/builder/SpringApplicationBuilder.java
index 8b96d5c0b3..dd6d28c25e 100644
--- a/spring-boot/src/main/java/org/springframework/boot/builder/SpringApplicationBuilder.java
+++ b/spring-boot/src/main/java/org/springframework/boot/builder/SpringApplicationBuilder.java
@@ -23,6 +23,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
import org.springframework.beans.factory.support.BeanNameGenerator;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.context.initializer.ParentContextApplicationContextInitializer;
+import org.springframework.boot.context.initializer.ServletContextApplicationContextInitializer;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
@@ -395,7 +396,14 @@ public class SpringApplicationBuilder {
*/
public SpringApplicationBuilder initializers(
ApplicationContextInitializer>... initializers) {
- addInitializers(false, initializers);
+ for (ApplicationContextInitializer> initializer : initializers) {
+ boolean prepend = false;
+ if (initializer instanceof ParentContextApplicationContextInitializer
+ || initializer instanceof ServletContextApplicationContextInitializer) {
+ prepend = true;
+ }
+ addInitializers(prepend, initializer);
+ }
return this;
}
diff --git a/spring-boot/src/main/java/org/springframework/boot/context/embedded/EmbeddedWebApplicationContext.java b/spring-boot/src/main/java/org/springframework/boot/context/embedded/EmbeddedWebApplicationContext.java
index 15c863886a..1602648500 100644
--- a/spring-boot/src/main/java/org/springframework/boot/context/embedded/EmbeddedWebApplicationContext.java
+++ b/spring-boot/src/main/java/org/springframework/boot/context/embedded/EmbeddedWebApplicationContext.java
@@ -147,11 +147,20 @@ public class EmbeddedWebApplicationContext extends GenericWebApplicationContext
}
private synchronized void createEmbeddedServletContainer() {
- if (this.embeddedServletContainer == null) {
+ if (this.embeddedServletContainer == null && getServletContext() == null) {
EmbeddedServletContainerFactory containerFactory = getEmbeddedServletContainerFactory();
this.embeddedServletContainer = containerFactory
.getEmbeddedServletContainer(getSelfInitializer());
}
+ else if (getServletContext() != null) {
+ try {
+ getSelfInitializer().onStartup(getServletContext());
+ }
+ catch (ServletException ex) {
+ throw new ApplicationContextException(
+ "Cannot initialize servlet context", ex);
+ }
+ }
WebApplicationContextUtils.registerWebApplicationScopes(getBeanFactory(),
getServletContext());
WebApplicationContextUtils.registerEnvironmentBeans(getBeanFactory(),
diff --git a/spring-boot/src/main/java/org/springframework/boot/web/SpringBootServletInitializer.java b/spring-boot/src/main/java/org/springframework/boot/web/SpringBootServletInitializer.java
index 13e62f42e2..c91f7c3103 100644
--- a/spring-boot/src/main/java/org/springframework/boot/web/SpringBootServletInitializer.java
+++ b/spring-boot/src/main/java/org/springframework/boot/web/SpringBootServletInitializer.java
@@ -81,9 +81,12 @@ public abstract class SpringBootServletInitializer implements WebApplicationInit
}
SpringApplicationBuilder application = new SpringApplicationBuilder()
.sources(getConfigClasses());
- application.initializers(
- new ParentContextApplicationContextInitializer(parent),
- new ServletContextApplicationContextInitializer(servletContext));
+ if (parent != null) {
+ application.initializers(new ParentContextApplicationContextInitializer(
+ parent));
+ }
+ application.initializers(new ServletContextApplicationContextInitializer(
+ servletContext));
application.contextClass(AnnotationConfigEmbeddedWebApplicationContext.class);
return (WebApplicationContext) application.run();
}