Merge branch '2.7.x'

pull/31104/head
Phillip Webb 3 years ago
commit e83ed4fe5e

@ -32,8 +32,10 @@ import java.util.stream.Collectors;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.CachedIntrospectionResults; import org.springframework.beans.CachedIntrospectionResults;
import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.groovy.GroovyBeanDefinitionReader; import org.springframework.beans.factory.groovy.GroovyBeanDefinitionReader;
import org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory; import org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory;
@ -56,6 +58,7 @@ import org.springframework.context.annotation.AnnotatedBeanDefinitionReader;
import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.AnnotationConfigUtils; import org.springframework.context.annotation.AnnotationConfigUtils;
import org.springframework.context.annotation.ClassPathBeanDefinitionScanner; import org.springframework.context.annotation.ClassPathBeanDefinitionScanner;
import org.springframework.context.annotation.ConfigurationClassPostProcessor;
import org.springframework.context.support.AbstractApplicationContext; import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericApplicationContext; import org.springframework.context.support.GenericApplicationContext;
import org.springframework.core.GenericTypeResolver; import org.springframework.core.GenericTypeResolver;
@ -397,6 +400,7 @@ public class SpringApplication {
if (this.lazyInitialization) { if (this.lazyInitialization) {
context.addBeanFactoryPostProcessor(new LazyInitializationBeanFactoryPostProcessor()); context.addBeanFactoryPostProcessor(new LazyInitializationBeanFactoryPostProcessor());
} }
context.addBeanFactoryPostProcessor(new PropertySourceOrderingBeanFactoryPostProcessor(context));
if (!NativeDetector.inNativeImage()) { if (!NativeDetector.inNativeImage()) {
// Load the sources // Load the sources
Set<Object> sources = getAllSources(); Set<Object> sources = getAllSources();
@ -1374,4 +1378,28 @@ public class SpringApplication {
return new LinkedHashSet<>(list); return new LinkedHashSet<>(list);
} }
/**
* {@link BeanFactoryPostProcessor} to re-order our property sources below any
* {@code @PropertySource} items added by the {@link ConfigurationClassPostProcessor}.
*/
private static class PropertySourceOrderingBeanFactoryPostProcessor implements BeanFactoryPostProcessor, Ordered {
private final ConfigurableApplicationContext context;
PropertySourceOrderingBeanFactoryPostProcessor(ConfigurableApplicationContext context) {
this.context = context;
}
@Override
public int getOrder() {
return Ordered.HIGHEST_PRECEDENCE;
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
DefaultPropertiesPropertySource.moveToEnd(this.context.getEnvironment());
}
}
} }

@ -1250,6 +1250,16 @@ class SpringApplicationTests {
assertThat(application.getEnvironmentPrefix()).isEqualTo("my"); assertThat(application.getEnvironmentPrefix()).isEqualTo("my");
} }
@Test
void movesConfigClassPropertySourcesToEnd() {
SpringApplication application = new SpringApplication(PropertySourceConfig.class);
application.setWebApplicationType(WebApplicationType.NONE);
application.setDefaultProperties(Collections.singletonMap("test.name", "test"));
this.context = application.run();
assertThat(this.context.getEnvironment().getProperty("test.name"))
.isEqualTo("spring-application-config-property-source");
}
@Test @Test
void deregistersShutdownHookForFailedApplicationContext() { void deregistersShutdownHookForFailedApplicationContext() {
SpringApplication application = new SpringApplication(BrokenPostConstructConfig.class); SpringApplication application = new SpringApplication(BrokenPostConstructConfig.class);
@ -1666,6 +1676,12 @@ class SpringApplicationTests {
} }
@Configuration(proxyBeanMethods = false)
@org.springframework.context.annotation.PropertySource("classpath:spring-application-config-property-source.properties")
static class PropertySourceConfig {
}
static class ExitStatusException extends RuntimeException implements ExitCodeGenerator { static class ExitStatusException extends RuntimeException implements ExitCodeGenerator {
@Override @Override

Loading…
Cancel
Save