Polishing (aligned with 6.0.x)

This commit is contained in:
Juergen Hoeller 2024-06-12 14:10:08 +02:00
parent e26ea007fa
commit 0ce1ef97ce
1 changed files with 14 additions and 6 deletions

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2023 the original author or authors. * Copyright 2002-2024 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -45,7 +45,11 @@ import org.springframework.lang.Nullable;
import org.springframework.util.Assert; import org.springframework.util.Assert;
/** /**
* Default implementation of the {@link LifecycleProcessor} strategy. * Spring's default implementation of the {@link LifecycleProcessor} strategy.
*
* <p>Provides interaction with {@link Lifecycle} and {@link SmartLifecycle} beans in
* groups for specific phases, on startup/shutdown as well as for explicit start/stop
* interactions on a {@link org.springframework.context.ConfigurableApplicationContext}.
* *
* @author Mark Fisher * @author Mark Fisher
* @author Juergen Hoeller * @author Juergen Hoeller
@ -145,13 +149,13 @@ public class DefaultLifecycleProcessor implements LifecycleProcessor, BeanFactor
lifecycleBeans.forEach((beanName, bean) -> { lifecycleBeans.forEach((beanName, bean) -> {
if (!autoStartupOnly || (bean instanceof SmartLifecycle && ((SmartLifecycle) bean).isAutoStartup())) { if (!autoStartupOnly || (bean instanceof SmartLifecycle && ((SmartLifecycle) bean).isAutoStartup())) {
int phase = getPhase(bean); int startupPhase = getPhase(bean);
phases.computeIfAbsent( phases.computeIfAbsent(startupPhase,
phase, phase -> new LifecycleGroup(phase, this.timeoutPerShutdownPhase, lifecycleBeans, autoStartupOnly)
p -> new LifecycleGroup(phase, this.timeoutPerShutdownPhase, lifecycleBeans, autoStartupOnly)
).add(beanName, bean); ).add(beanName, bean);
} }
}); });
if (!phases.isEmpty()) { if (!phases.isEmpty()) {
phases.values().forEach(LifecycleGroup::start); phases.values().forEach(LifecycleGroup::start);
} }
@ -191,6 +195,7 @@ public class DefaultLifecycleProcessor implements LifecycleProcessor, BeanFactor
private void stopBeans() { private void stopBeans() {
Map<String, Lifecycle> lifecycleBeans = getLifecycleBeans(); Map<String, Lifecycle> lifecycleBeans = getLifecycleBeans();
Map<Integer, LifecycleGroup> phases = new HashMap<>(); Map<Integer, LifecycleGroup> phases = new HashMap<>();
lifecycleBeans.forEach((beanName, bean) -> { lifecycleBeans.forEach((beanName, bean) -> {
int shutdownPhase = getPhase(bean); int shutdownPhase = getPhase(bean);
LifecycleGroup group = phases.get(shutdownPhase); LifecycleGroup group = phases.get(shutdownPhase);
@ -200,6 +205,7 @@ public class DefaultLifecycleProcessor implements LifecycleProcessor, BeanFactor
} }
group.add(beanName, bean); group.add(beanName, bean);
}); });
if (!phases.isEmpty()) { if (!phases.isEmpty()) {
List<Integer> keys = new ArrayList<>(phases.keySet()); List<Integer> keys = new ArrayList<>(phases.keySet());
keys.sort(Collections.reverseOrder()); keys.sort(Collections.reverseOrder());
@ -314,6 +320,8 @@ public class DefaultLifecycleProcessor implements LifecycleProcessor, BeanFactor
/** /**
* Helper class for maintaining a group of Lifecycle beans that should be started * Helper class for maintaining a group of Lifecycle beans that should be started
* and stopped together based on their 'phase' value (or the default value of 0). * and stopped together based on their 'phase' value (or the default value of 0).
* The group is expected to be created in an ad-hoc fashion and group members are
* expected to always have the same 'phase' value.
*/ */
private class LifecycleGroup { private class LifecycleGroup {