@ -24,6 +24,7 @@ import java.util.LinkedHashSet;
import java.util.List ;
import java.util.List ;
import java.util.Map ;
import java.util.Map ;
import java.util.Set ;
import java.util.Set ;
import java.util.concurrent.atomic.AtomicBoolean ;
import java.util.concurrent.atomic.AtomicInteger ;
import java.util.concurrent.atomic.AtomicInteger ;
import java.util.concurrent.atomic.AtomicReference ;
import java.util.concurrent.atomic.AtomicReference ;
import java.util.function.Supplier ;
import java.util.function.Supplier ;
@ -1363,18 +1364,30 @@ class SpringApplicationTests {
@Test
@Test
void fromRunsWithAdditionalSources ( ) {
void fromRunsWithAdditionalSources ( ) {
assertThat ( ExampleAdditionalConfig . local . get ( ) ) . isNull ( ) ;
assertThat ( ExampleAdditionalConfig . local . get ( ) ) . isNull ( ) ;
SpringApplication . from ( ExampleFromMainMethod : : main ) . with ( ExampleAdditionalConfig . class ) . run ( ) ;
this . context = SpringApplication . from ( ExampleFromMainMethod : : main )
. with ( ExampleAdditionalConfig . class )
. run ( )
. getApplicationContext ( ) ;
assertThat ( ExampleAdditionalConfig . local . get ( ) ) . isNotNull ( ) ;
assertThat ( ExampleAdditionalConfig . local . get ( ) ) . isNotNull ( ) ;
ExampleAdditionalConfig . local . set ( null ) ;
ExampleAdditionalConfig . local . set ( null ) ;
}
}
@Test
@Test
void fromReturnsApplicationContext ( ) {
void fromReturnsApplicationContext ( ) {
ConfigurableApplicationContext context = SpringApplication . from ( ExampleFromMainMethod : : main )
this . context = SpringApplication . from ( ExampleFromMainMethod : : main )
. with ( ExampleAdditionalConfig . class )
. with ( ExampleAdditionalConfig . class )
. run ( )
. run ( )
. getApplicationContext ( ) ;
. getApplicationContext ( ) ;
assertThat ( context ) . isNotNull ( ) ;
assertThat ( this . context ) . isNotNull ( ) ;
}
@Test
void fromWithMultipleApplicationsOnlyAppliesAdditionalSourcesOnce ( ) {
this . context = SpringApplication . from ( MultipleApplicationsMainMethod : : main )
. with ( SingleUseAdditionalConfig . class )
. run ( )
. getApplicationContext ( ) ;
assertThatNoException ( ) . isThrownBy ( ( ) - > this . context . getBean ( SingleUseAdditionalConfig . class ) ) ;
}
}
private < S extends AvailabilityState > ArgumentMatcher < ApplicationEvent > isAvailabilityChangeEventWithState (
private < S extends AvailabilityState > ArgumentMatcher < ApplicationEvent > isAvailabilityChangeEventWithState (
@ -1949,6 +1962,31 @@ class SpringApplicationTests {
}
}
static class MultipleApplicationsMainMethod {
static void main ( String [ ] args ) {
SpringApplication application = new SpringApplication ( ExampleConfig . class ) ;
application . setWebApplicationType ( WebApplicationType . NONE ) ;
application . addListeners ( new ApplicationListener < ApplicationEnvironmentPreparedEvent > ( ) {
@Override
public void onApplicationEvent ( ApplicationEnvironmentPreparedEvent event ) {
SpringApplicationBuilder builder = new SpringApplicationBuilder (
InnerApplicationConfiguration . class ) ;
builder . web ( WebApplicationType . NONE ) ;
builder . run ( ) . close ( ) ;
}
} ) ;
application . run ( args ) ;
}
static class InnerApplicationConfiguration {
}
}
@Configuration
@Configuration
static class ExampleAdditionalConfig {
static class ExampleAdditionalConfig {
@ -1960,4 +1998,17 @@ class SpringApplicationTests {
}
}
@Configuration
static class SingleUseAdditionalConfig {
private static AtomicBoolean used = new AtomicBoolean ( false ) ;
SingleUseAdditionalConfig ( ) {
if ( ! used . compareAndSet ( false , true ) ) {
throw new IllegalStateException ( "Single-use configuration has already been used" ) ;
}
}
}
}
}