Expose ApplicationContext when using SpringApplication#from

This commit returns the running application context when running an
application via SpringApplication#from so that it is consistent with
the regular SpringApplication#run.

Closes gh-35203
pull/35286/head
Stephane Nicoll 2 years ago
parent 10fd7517a8
commit e6afc490b0

@ -1453,14 +1453,35 @@ public class SpringApplication {
/** /**
* Run the application using the given args. * Run the application using the given args.
* @param args the main method args * @param args the main method args
* @return the running {@link ApplicationContext}
*/ */
public void run(String... args) { public ConfigurableApplicationContext run(String... args) {
withHook(this::getRunListener, () -> this.main.accept(args)); ContextLoaderHook hook = new ContextLoaderHook(this.sources);
withHook(hook, () -> this.main.accept(args));
return hook.applicationContext;
} }
private SpringApplicationRunListener getRunListener(SpringApplication springApplication) { private static class ContextLoaderHook implements SpringApplicationHook {
springApplication.addPrimarySources(this.sources);
return null; private final Set<Class<?>> sources;
private ConfigurableApplicationContext applicationContext;
ContextLoaderHook(Set<Class<?>> sources) {
this.sources = sources;
}
@Override
public SpringApplicationRunListener getRunListener(SpringApplication springApplication) {
springApplication.addPrimarySources(this.sources);
return new SpringApplicationRunListener() {
@Override
public void contextPrepared(ConfigurableApplicationContext context) {
ContextLoaderHook.this.applicationContext = context;
}
};
}
} }
} }

@ -1368,6 +1368,14 @@ class SpringApplicationTests {
ExampleAdditionalConfig.local.set(null); ExampleAdditionalConfig.local.set(null);
} }
@Test
void fromReturnsApplicationContext() {
ConfigurableApplicationContext context = SpringApplication.from(ExampleFromMainMethod::main)
.with(ExampleAdditionalConfig.class)
.run();
assertThat(context).isNotNull();
}
private <S extends AvailabilityState> ArgumentMatcher<ApplicationEvent> isAvailabilityChangeEventWithState( private <S extends AvailabilityState> ArgumentMatcher<ApplicationEvent> isAvailabilityChangeEventWithState(
S state) { S state) {
return (argument) -> (argument instanceof AvailabilityChangeEvent<?>) return (argument) -> (argument instanceof AvailabilityChangeEvent<?>)

Loading…
Cancel
Save