Polish "Allow SpringApplicationBuilder to specify a ResourceLoader"

See gh-26690
This commit is contained in:
Stephane Nicoll
2021-05-31 08:23:21 +02:00
parent 7b0ba35025
commit d5d23d73e7
2 changed files with 40 additions and 22 deletions

View File

@@ -94,7 +94,7 @@ public class SpringApplicationBuilder {
private boolean configuredAsChild = false;
public SpringApplicationBuilder(Class<?>... sources) {
this.application = createSpringApplication(null, sources);
this(null, sources);
}
public SpringApplicationBuilder(ResourceLoader resourceLoader, Class<?>... sources) {
@@ -102,29 +102,27 @@ public class SpringApplicationBuilder {
}
/**
* 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}
* Creates a new {@link SpringApplication} instance from the given sources. Subclasses
* may override in order to provide a custom subclass of {@link SpringApplication}
* @param sources the sources
* @return the {@link org.springframework.boot.SpringApplication} instance
* @return the {@link SpringApplication} instance
* @since 1.1.0
* @deprecated Use {@link #createSpringApplication(ResourceLoader, Class...)} with
* null resource loader
* @deprecated since 2.6.0 for removal in 2.8.0 in favor of
* {@link #createSpringApplication(ResourceLoader, Class...)}
*/
@Deprecated
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...)})
* Creates a new {@link SpringApplication} instances from the given sources using the
* given {@link ResourceLoader}. Subclasses may override in order to provide a custom
* subclass of {@link SpringApplication}
* @param resourceLoader the resource loader (can be null)
* @param sources the sources
* @return the {@link org.springframework.boot.SpringApplication} instance
* @since 2.5.0
* @return the {@link SpringApplication} instance
* @since 2.6.0
*/
protected SpringApplication createSpringApplication(ResourceLoader resourceLoader, Class<?>... sources) {
return new SpringApplication(resourceLoader, sources);

View File

@@ -20,11 +20,13 @@ import java.net.URL;
import java.net.URLClassLoader;
import java.util.Collections;
import org.assertj.core.api.InstanceOfAssertFactories;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationContextFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.SpringApplicationShutdownHookInstance;
import org.springframework.boot.WebApplicationType;
import org.springframework.context.ApplicationContext;
@@ -41,6 +43,7 @@ import org.springframework.util.StringUtils;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
@@ -310,13 +313,19 @@ class SpringApplicationBuilderTests {
}
@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);
void customApplicationWithResourceLoader() {
ResourceLoader resourceLoader = mock(ResourceLoader.class);
SpringApplicationBuilder applicationBuilder = new SpringApplicationBuilder(resourceLoader,
ExampleConfig.class) {
@Override
protected SpringApplication createSpringApplication(ResourceLoader resourceLoader, Class<?>... sources) {
return new CustomSpringApplication(resourceLoader, sources);
}
};
SpringApplication application = applicationBuilder.build();
assertThat(application).isInstanceOf(CustomSpringApplication.class)
.asInstanceOf(InstanceOfAssertFactories.type(CustomSpringApplication.class))
.satisfies((customApp) -> assertThat(customApp.resourceLoader).isEqualTo(resourceLoader));
}
@Configuration(proxyBeanMethods = false)
@@ -329,6 +338,17 @@ class SpringApplicationBuilderTests {
}
static class CustomSpringApplication extends SpringApplication {
private final ResourceLoader resourceLoader;
CustomSpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {
super(resourceLoader, primarySources);
this.resourceLoader = resourceLoader;
}
}
static class SpyApplicationContext extends AnnotationConfigApplicationContext {
private final ConfigurableApplicationContext applicationContext = spy(new AnnotationConfigApplicationContext());