SmartLifeCycle是一个接口,当Spring容器加载完所有的Bean并且初始化之后,会继续回调实现了SmartLifeCycle接口的类中对应的方法,比如(start、stop)。
SmartLifecycle和Lifecycle区别
- 不需要容器显示调用start()方法,就可以回调SmartLifecycle接口的start()。
- 容器里面如果有多个SmartLifecycle实例,可以控制调用的顺序。
- Lifecycle需要显示调用容器的start()和stop()方法,Lifecycle的接口方法才会被执行。
- bean的初始化方法和销毁方法是Bean生命周期级别的;而Lifecycle是容器生命周期级别的。
代码案例
spring boot 项目
package com.jvmoomdemo;
import org.springframework.context.SmartLifecycle;
import org.springframework.stereotype.Component;
@Component
public class TestSmartLifeCycle implements SmartLifecycle {
private volatile boolean running = false;
@Override
public boolean isAutoStartup() {
return true;
}
@Override
public void start() {
System.out.println("...容器启动完成 ...");
this.running = true;
}
@Override
public void stop(Runnable callback) {
System.out.println("================stop==============");
stop();
callback.run();
}
@Override
public void stop() {
System.out.println("...容器停止 ...");
this.running = false;
}
@Override
public int getPhase() {
return 0;
}
@Override
public boolean isRunning() {
System.out.println("...检查运行状态 ...");
return this.running;
}
}
执行效果:
停止点击红圈
SmartLifeCycle作用
- Spring加载和初始化所有bean后,执行一些任务或者启动需要的异步服务,可以使用 SmartLifecycle 来完成。
- 开发者在所有的bean都创建完成(getBean) 之后执行自己的初始化工作,或者在退出时执行资源销毁工作。