From 7b0ba350256021c8cd8786382e04ba49da2b8583 Mon Sep 17 00:00:00 2001 From: Jamin Hitchcock Date: Thu, 27 May 2021 21:39:37 -0500 Subject: [PATCH] Allow SpringApplicationBuilder to specify a ResourceLoader See gh-26690 --- .../builder/SpringApplicationBuilder.java | 23 ++++++++++++++++++- .../SpringApplicationBuilderTests.java | 10 ++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/builder/SpringApplicationBuilder.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/builder/SpringApplicationBuilder.java index a4893ff516..b9887f323d 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/builder/SpringApplicationBuilder.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/builder/SpringApplicationBuilder.java @@ -94,7 +94,11 @@ public class SpringApplicationBuilder { private boolean configuredAsChild = false; public SpringApplicationBuilder(Class... sources) { - this.application = createSpringApplication(sources); + this.application = createSpringApplication(null, sources); + } + + public SpringApplicationBuilder(ResourceLoader resourceLoader, Class... sources) { + this.application = createSpringApplication(resourceLoader, sources); } /** @@ -104,11 +108,28 @@ public class SpringApplicationBuilder { * @param sources the sources * @return the {@link org.springframework.boot.SpringApplication} instance * @since 1.1.0 + * @deprecated Use {@link #createSpringApplication(ResourceLoader, Class...)} with + * null resource loader */ protected SpringApplication createSpringApplication(Class... sources) { return new SpringApplication(sources); } + /** + * Creates a new {@link org.springframework.boot.SpringApplication} instances from the + * given sources. Subclasses may override in order to provide a custom subclass of + * {@link org.springframework.boot.SpringApplication} + * @param resourceLoader the resource loader, can be null to use default resource + * loader (see + * {@link org.springframework.boot.SpringApplication#SpringApplication(ResourceLoader, Class...)}) + * @param sources the sources + * @return the {@link org.springframework.boot.SpringApplication} instance + * @since 2.5.0 + */ + protected SpringApplication createSpringApplication(ResourceLoader resourceLoader, Class... sources) { + return new SpringApplication(resourceLoader, sources); + } + /** * Accessor for the current application context. * @return the current application context (or null if not yet running) diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/builder/SpringApplicationBuilderTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/builder/SpringApplicationBuilderTests.java index c571779449..48777e12ad 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/builder/SpringApplicationBuilderTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/builder/SpringApplicationBuilderTests.java @@ -309,6 +309,16 @@ class SpringApplicationBuilderTests { assertThat(builder.application().getEnvironmentPrefix()).isEqualTo("test"); } + @Test + void createWithResourceLoader() { + ClassLoader classLoader = new URLClassLoader(new URL[0], getClass().getClassLoader()); + SpringApplicationBuilder application = new SpringApplicationBuilder(new DefaultResourceLoader(classLoader), + ExampleConfig.class) + .contextFactory(ApplicationContextFactory.ofContextClass(SpyApplicationContext.class)); + this.context = application.run(); + assertThat(this.context.getClassLoader()).isEqualTo(classLoader); + } + @Configuration(proxyBeanMethods = false) static class ExampleConfig {