



















Lifecycle组件是为了扩展bean的生命周期功能而增加的,它还有一个直接子类为SmartLifecycle接口,该接口能够控制组件生命周期的执行顺序。
下面是接口定义
public interface Lifecycle {
void start();
void stop();
boolean isRunning();
}
public interface SmartLifecycle extends Lifecycle, Phased {
int DEFAULT_PHASE = Integer.MAX_VALUE;
default boolean isAutoStartup() {
return true;
}
default void stop(Runnable callback) {
stop();
callback.run();
}
@Override
default int getPhase() {
return DEFAULT_PHASE;
}
}
SmartLifecycle和Lifecycle区别如下
因此只需要使用SmartLifecycle即可。
另外一个细节就是isRunning方法了,spring在调用start方法之前会先判断isRunning方法是不是返回false,调用stop方法之前会判断isRunning方法是不是返回true
实现模板
public class SimpleLifecycle implements SmartLifecycle {
/**
* 如果stop方法有异步线程, 则需要使用volatile修饰
*/
private volatile boolean running;
@Override
public void start() {
running = true;
// doSomething
}
@Override
public void stop() {
running = false;
// doSomething
}
@Override
public boolean isRunning() {
return running;
}
/**
* 根据需要指定顺序
*/
@Override
public int getPhase() {
return 0;
}
}
AbstractApplicationContext类
refresh -> finishRefresh -> getLifecycleProcessor().onRefresh()
触发SmartLifecycle执行的类为LifecycleProcessor
AbstractApplicationContext类
close -> doClose -> lifecycleProcessor.onClose()
tomcat容器的启动和关闭就是通过SmartLifecycle来实现的
WebServerStartStopLifecycle
WebServerGracefulShutdownLifecycle(开启优雅停机属性才有作用, server.shutdown=graceful),这样tomcat就会停止处理新的请求,会等待现有请求执行完毕。等待最大时间为spring.lifecycle.timeout-per-shutdown-phase,超过这个时间还没处理完成,WebServerStartStopLifecycle的stop方法就会执行了,会修改WebServerGracefulShutdownLifecycle循环的标记而退出。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。