Only consider current context when finding lifecycle processor

Previously, LifecycleAutoConfiguration would check the current context
and all of its ancestors for a lifecycle processor bean, only
configuring a custom processor if one was not found. Every context
has a lifecycle processor so this check meant that lifecycle processing
timeout could not be customized in any context with a parent.

This commit updates the auto-configuration to only check the current
context.

Closes gh-22014
pull/22035/head
Andy Wilkinson 4 years ago
parent 28643e4d2d
commit 1e97ff834e

@ -18,6 +18,7 @@ package org.springframework.boot.autoconfigure.context;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.SearchStrategy;
import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
@ -36,7 +37,8 @@ import org.springframework.context.support.DefaultLifecycleProcessor;
public class LifecycleAutoConfiguration { public class LifecycleAutoConfiguration {
@Bean(name = AbstractApplicationContext.LIFECYCLE_PROCESSOR_BEAN_NAME) @Bean(name = AbstractApplicationContext.LIFECYCLE_PROCESSOR_BEAN_NAME)
@ConditionalOnMissingBean(name = AbstractApplicationContext.LIFECYCLE_PROCESSOR_BEAN_NAME) @ConditionalOnMissingBean(name = AbstractApplicationContext.LIFECYCLE_PROCESSOR_BEAN_NAME,
search = SearchStrategy.CURRENT)
public DefaultLifecycleProcessor defaultLifecycleProcessor(LifecycleProperties properties) { public DefaultLifecycleProcessor defaultLifecycleProcessor(LifecycleProperties properties) {
DefaultLifecycleProcessor lifecycleProcessor = new DefaultLifecycleProcessor(); DefaultLifecycleProcessor lifecycleProcessor = new DefaultLifecycleProcessor();
lifecycleProcessor.setTimeoutPerShutdownPhase(properties.getTimeoutPerShutdownPhase().toMillis()); lifecycleProcessor.setTimeoutPerShutdownPhase(properties.getTimeoutPerShutdownPhase().toMillis());

@ -55,6 +55,18 @@ public class LifecycleAutoConfigurationTests {
}); });
} }
@Test
void lifecycleProcessorIsConfiguredWithCustomDefaultTimeoutInAChildContext() {
new ApplicationContextRunner().run((parent) -> {
this.contextRunner.withParent(parent).withPropertyValues("spring.lifecycle.timeout-per-shutdown-phase=15s")
.run((child) -> {
assertThat(child).hasBean(AbstractApplicationContext.LIFECYCLE_PROCESSOR_BEAN_NAME);
Object processor = child.getBean(AbstractApplicationContext.LIFECYCLE_PROCESSOR_BEAN_NAME);
assertThat(processor).extracting("timeoutPerShutdownPhase").isEqualTo(15000L);
});
});
}
@Test @Test
void whenUserDefinesALifecycleProcessorBeanThenTheAutoConfigurationBacksOff() { void whenUserDefinesALifecycleProcessorBeanThenTheAutoConfigurationBacksOff() {
this.contextRunner.withUserConfiguration(LifecycleProcessorConfiguration.class).run((context) -> { this.contextRunner.withUserConfiguration(LifecycleProcessorConfiguration.class).run((context) -> {

Loading…
Cancel
Save