diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/ApplicationContextFactory.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/ApplicationContextFactory.java index 9f9d08e71a..f640875335 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/ApplicationContextFactory.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/ApplicationContextFactory.java @@ -21,6 +21,8 @@ import java.util.function.Supplier; import org.springframework.beans.BeanUtils; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.support.GenericApplicationContext; +import org.springframework.core.NativeDetector; import org.springframework.core.io.support.SpringFactoriesLoader; /** @@ -49,7 +51,8 @@ public interface ApplicationContextFactory { return context; } } - return new AnnotationConfigApplicationContext(); + return NativeDetector.inNativeImage() ? new GenericApplicationContext() + : new AnnotationConfigApplicationContext(); } catch (Exception ex) { throw new IllegalStateException("Unable create a default ApplicationContext instance, " diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/reactive/context/AnnotationConfigReactiveWebServerApplicationContext.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/reactive/context/AnnotationConfigReactiveWebServerApplicationContext.java index 9c9e3b6974..b46bf7da33 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/reactive/context/AnnotationConfigReactiveWebServerApplicationContext.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/reactive/context/AnnotationConfigReactiveWebServerApplicationContext.java @@ -23,9 +23,6 @@ import java.util.Set; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.support.BeanNameGenerator; import org.springframework.beans.factory.support.DefaultListableBeanFactory; -import org.springframework.boot.ApplicationContextFactory; -import org.springframework.boot.WebApplicationType; -import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.AnnotatedBeanDefinitionReader; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.AnnotationConfigRegistry; @@ -212,18 +209,4 @@ public class AnnotationConfigReactiveWebServerApplicationContext extends Reactiv } } - /** - * {@link ApplicationContextFactory} registered in {@code spring.factories} to support - * {@link AnnotationConfigReactiveWebServerApplicationContext}. - */ - static class Factory implements ApplicationContextFactory { - - @Override - public ConfigurableApplicationContext create(WebApplicationType webApplicationType) { - return (webApplicationType != WebApplicationType.REACTIVE) ? null - : new AnnotationConfigReactiveWebServerApplicationContext(); - } - - } - } diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/reactive/context/ReactiveWebServerApplicationContextFactory.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/reactive/context/ReactiveWebServerApplicationContextFactory.java new file mode 100644 index 0000000000..29d1de58a2 --- /dev/null +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/reactive/context/ReactiveWebServerApplicationContextFactory.java @@ -0,0 +1,43 @@ +/* + * Copyright 2012-2022 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 + * + * https://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.web.reactive.context; + +import org.springframework.boot.ApplicationContextFactory; +import org.springframework.boot.WebApplicationType; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.core.NativeDetector; + +/** + * {@link ApplicationContextFactory} registered in {@code spring.factories} to support + * {@link AnnotationConfigReactiveWebServerApplicationContext} and + * {@link ReactiveWebServerApplicationContext}. + * + * @author Phillip Webb + * @author Andy Wilkinson + */ +class ReactiveWebServerApplicationContextFactory implements ApplicationContextFactory { + + @Override + public ConfigurableApplicationContext create(WebApplicationType webApplicationType) { + if (webApplicationType != WebApplicationType.REACTIVE) { + return null; + } + return NativeDetector.inNativeImage() ? new ReactiveWebServerApplicationContext() + : new AnnotationConfigReactiveWebServerApplicationContext(); + } + +} diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/servlet/context/AnnotationConfigServletWebServerApplicationContext.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/servlet/context/AnnotationConfigServletWebServerApplicationContext.java index 2513b0cf3f..cb0b4c29d1 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/servlet/context/AnnotationConfigServletWebServerApplicationContext.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/servlet/context/AnnotationConfigServletWebServerApplicationContext.java @@ -23,9 +23,6 @@ import java.util.Set; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.support.BeanNameGenerator; import org.springframework.beans.factory.support.DefaultListableBeanFactory; -import org.springframework.boot.ApplicationContextFactory; -import org.springframework.boot.WebApplicationType; -import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.AnnotatedBeanDefinitionReader; import org.springframework.context.annotation.AnnotationConfigRegistry; import org.springframework.context.annotation.AnnotationConfigUtils; @@ -209,18 +206,4 @@ public class AnnotationConfigServletWebServerApplicationContext extends ServletW } } - /** - * {@link ApplicationContextFactory} registered in {@code spring.factories} to support - * {@link AnnotationConfigServletWebServerApplicationContext}. - */ - static class Factory implements ApplicationContextFactory { - - @Override - public ConfigurableApplicationContext create(WebApplicationType webApplicationType) { - return (webApplicationType != WebApplicationType.SERVLET) ? null - : new AnnotationConfigServletWebServerApplicationContext(); - } - - } - } diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/servlet/context/ServletWebServerApplicationContextFactory.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/servlet/context/ServletWebServerApplicationContextFactory.java new file mode 100644 index 0000000000..52a3718001 --- /dev/null +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/servlet/context/ServletWebServerApplicationContextFactory.java @@ -0,0 +1,43 @@ +/* + * Copyright 2012-2022 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 + * + * https://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.web.servlet.context; + +import org.springframework.boot.ApplicationContextFactory; +import org.springframework.boot.WebApplicationType; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.core.NativeDetector; + +/** + * {@link ApplicationContextFactory} registered in {@code spring.factories} to support + * {@link AnnotationConfigServletWebServerApplicationContext} and + * {@link ServletWebServerApplicationContext}. + * + * @author Phillip Webb + * @author Andy Wilkinson + */ +class ServletWebServerApplicationContextFactory implements ApplicationContextFactory { + + @Override + public ConfigurableApplicationContext create(WebApplicationType webApplicationType) { + if (webApplicationType != WebApplicationType.SERVLET) { + return null; + } + return NativeDetector.inNativeImage() ? new ServletWebServerApplicationContext() + : new AnnotationConfigServletWebServerApplicationContext(); + } + +} diff --git a/spring-boot-project/spring-boot/src/main/resources/META-INF/spring.factories b/spring-boot-project/spring-boot/src/main/resources/META-INF/spring.factories index b086675b10..4641c7b8dd 100644 --- a/spring-boot-project/spring-boot/src/main/resources/META-INF/spring.factories +++ b/spring-boot-project/spring-boot/src/main/resources/META-INF/spring.factories @@ -21,8 +21,8 @@ org.springframework.boot.context.config.StandardConfigDataLoader # Application Context Factories org.springframework.boot.ApplicationContextFactory=\ -org.springframework.boot.web.reactive.context.AnnotationConfigReactiveWebServerApplicationContext.Factory,\ -org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext.Factory +org.springframework.boot.web.reactive.context.ReactiveWebServerApplicationContextFactory,\ +org.springframework.boot.web.servlet.context.ServletWebServerApplicationContextFactory # Run Listeners org.springframework.boot.SpringApplicationRunListener=\