|
|
|
@ -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 { |
|
|
|
|
|
|
|
|
|
|
|
|