Skip to content

Commit 5985234

Browse files
committed
Merge pull request #26690 from jaminh
* pr/26690: Polish "Allow SpringApplicationBuilder to specify a ResourceLoader" Allow SpringApplicationBuilder to specify a ResourceLoader Closes gh-26690
2 parents 41e00e1 + d5d23d7 commit 5985234

File tree

2 files changed

+54
-5
lines changed

2 files changed

+54
-5
lines changed

spring-boot-project/spring-boot/src/main/java/org/springframework/boot/builder/SpringApplicationBuilder.java

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -94,21 +94,40 @@ public class SpringApplicationBuilder {
9494
private boolean configuredAsChild = false;
9595

9696
public SpringApplicationBuilder(Class<?>... sources) {
97-
this.application = createSpringApplication(sources);
97+
this(null, sources);
98+
}
99+
100+
public SpringApplicationBuilder(ResourceLoader resourceLoader, Class<?>... sources) {
101+
this.application = createSpringApplication(resourceLoader, sources);
98102
}
99103

100104
/**
101-
* Creates a new {@link org.springframework.boot.SpringApplication} instances from the
102-
* given sources. Subclasses may override in order to provide a custom subclass of
103-
* {@link org.springframework.boot.SpringApplication}
105+
* Creates a new {@link SpringApplication} instance from the given sources. Subclasses
106+
* may override in order to provide a custom subclass of {@link SpringApplication}
104107
* @param sources the sources
105-
* @return the {@link org.springframework.boot.SpringApplication} instance
108+
* @return the {@link SpringApplication} instance
106109
* @since 1.1.0
110+
* @deprecated since 2.6.0 for removal in 2.8.0 in favor of
111+
* {@link #createSpringApplication(ResourceLoader, Class...)}
107112
*/
113+
@Deprecated
108114
protected SpringApplication createSpringApplication(Class<?>... sources) {
109115
return new SpringApplication(sources);
110116
}
111117

118+
/**
119+
* Creates a new {@link SpringApplication} instances from the given sources using the
120+
* given {@link ResourceLoader}. Subclasses may override in order to provide a custom
121+
* subclass of {@link SpringApplication}
122+
* @param resourceLoader the resource loader (can be null)
123+
* @param sources the sources
124+
* @return the {@link SpringApplication} instance
125+
* @since 2.6.0
126+
*/
127+
protected SpringApplication createSpringApplication(ResourceLoader resourceLoader, Class<?>... sources) {
128+
return new SpringApplication(resourceLoader, sources);
129+
}
130+
112131
/**
113132
* Accessor for the current application context.
114133
* @return the current application context (or null if not yet running)

spring-boot-project/spring-boot/src/test/java/org/springframework/boot/builder/SpringApplicationBuilderTests.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,13 @@
2020
import java.net.URLClassLoader;
2121
import java.util.Collections;
2222

23+
import org.assertj.core.api.InstanceOfAssertFactories;
2324
import org.junit.jupiter.api.AfterEach;
2425
import org.junit.jupiter.api.Test;
2526

2627
import org.springframework.boot.ApplicationArguments;
2728
import org.springframework.boot.ApplicationContextFactory;
29+
import org.springframework.boot.SpringApplication;
2830
import org.springframework.boot.SpringApplicationShutdownHookInstance;
2931
import org.springframework.boot.WebApplicationType;
3032
import org.springframework.context.ApplicationContext;
@@ -41,6 +43,7 @@
4143

4244
import static org.assertj.core.api.Assertions.assertThat;
4345
import static org.mockito.ArgumentMatchers.any;
46+
import static org.mockito.Mockito.mock;
4447
import static org.mockito.Mockito.spy;
4548
import static org.mockito.Mockito.verify;
4649

@@ -309,6 +312,22 @@ void setEnvironmentPrefix() {
309312
assertThat(builder.application().getEnvironmentPrefix()).isEqualTo("test");
310313
}
311314

315+
@Test
316+
void customApplicationWithResourceLoader() {
317+
ResourceLoader resourceLoader = mock(ResourceLoader.class);
318+
SpringApplicationBuilder applicationBuilder = new SpringApplicationBuilder(resourceLoader,
319+
ExampleConfig.class) {
320+
@Override
321+
protected SpringApplication createSpringApplication(ResourceLoader resourceLoader, Class<?>... sources) {
322+
return new CustomSpringApplication(resourceLoader, sources);
323+
}
324+
};
325+
SpringApplication application = applicationBuilder.build();
326+
assertThat(application).isInstanceOf(CustomSpringApplication.class)
327+
.asInstanceOf(InstanceOfAssertFactories.type(CustomSpringApplication.class))
328+
.satisfies((customApp) -> assertThat(customApp.resourceLoader).isEqualTo(resourceLoader));
329+
}
330+
312331
@Configuration(proxyBeanMethods = false)
313332
static class ExampleConfig {
314333

@@ -319,6 +338,17 @@ static class ChildConfig {
319338

320339
}
321340

341+
static class CustomSpringApplication extends SpringApplication {
342+
343+
private final ResourceLoader resourceLoader;
344+
345+
CustomSpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {
346+
super(resourceLoader, primarySources);
347+
this.resourceLoader = resourceLoader;
348+
}
349+
350+
}
351+
322352
static class SpyApplicationContext extends AnnotationConfigApplicationContext {
323353

324354
private final ConfigurableApplicationContext applicationContext = spy(new AnnotationConfigApplicationContext());

0 commit comments

Comments
 (0)