Fix package tangle by changing `ApplicationContextFactory.DEFAULT` to
use `spring.factories` to discover implementations rather than needing
direct access to our own `ApplicationContext` classes.
Closes gh-30272
Previously, if spring.main.web-application-type was configured in
application.properties to servlet or reactive, setting
webEnvironment=NONE on @SpringBootTest would not work correctly and
a servlet or reactive web application context would be created
based on the value of spring.main.web-application-type.
This commit updates the test context bootstapper to set
spring.main.web-application-type to none when webEnvironment has been
set to none. This is done in the merged context configuration's
property source properties which are applied to the environment in a
high-precedence test property source that will override configuration
in application.properties.
Closes gh-29695
Previously, SpringBootContextLoader would configure its
SpringApplication with an ApplicationContextFactory that ignores
the WebApplicationType with which its called and instead returns a
hard-coded type of context based on the type of the
MergedContextConfiguration. This hard-coding would result in the
wrong type of context being used if a subsequent change was made to
the application's WebApplicationType, for example due to binding of
the spring.main.web-application-type configuration property.
This commit updates SpringBootContextLoader to configure
SpringApplication with an ApplicationContextFactory that takes the
WebApplicationType with which it is called into consideration.
Fixes gh-29170
This works around spring-projects/spring-framework#28298. The bug
means that when a @Configuration class is annotated with
@ConfigurationProperties any bean defined by a static @Bean method
is considered to be annotated with @ConfigurationProperties.
See gh-30068