Spring SmartLifecycle用法
Spring SmartLifecycle 在容器所有bean加载和初始化完毕执行
在使用Spring开发时,我们都知道,所有bean都交给Spring容器来统一管理,其中包括每一个bean的加载和初始化。
有时候我们需要在Spring加载和初始化所有bean后,接着执行一些任务或者启动需要的异步服务,这样我们可以使用 SmartLifecycle 来做到。
SmartLifecycle 是一个接口
当Spring容器加载所有bean并完成初始化之后,会接着回调实现该接口的类中对应的方法(start()方法)。
import org.springframework.context.SmartLifecycle;
import org.springframework.stereotype.Component;
@Component
public class TestSmartLifecycle implements SmartLifecycle {
private boolean isRunning = false;
@Override
public void start() {
System.out.println("start");
// 执行完其他业务后,可以修改 isRunning = true
isRunning = true;
}
@Override
public int getPhase() {
// 默认为0
return 0;
}
@Override
public boolean isAutoStartup() {
// 默认为false
return true;
}
@Override
public boolean isRunning() {
// 默认返回false
return isRunning;
}
@Override
public void stop(Runnable callback) {
System.out.println("stop(Runnable)");
// 如果你让isRunning返回true,需要执行stop这个方法,那么就不要忘记调用callback.run()。
// 否则在你程序退出时,Spring的DefaultLifecycleProcessor会认为你这个TestSmartLifecycle没有stop完成,程序会一直卡着结束不了,等待一定时间(默认超时时间30秒)后才会自动结束。
// PS:如果你想修改这个默认超时时间,可以按下面思路做,当然下面代码是springmvc配置文件形式的参考,在SpringBoot中自然不是配置xml来完成,这里只是提供一种思路。
// <bean id="lifecycleProcessor" class="org.springframework.context.support.DefaultLifecycleProcessor">
// <!-- timeout value in milliseconds -->
// <property name="timeoutPerShutdownPhase" value="10000"/>
// </bean>
callback.run();
isRunning = false;
}
@Override
public void stop() {
System.out.println("stop");
isRunning = false;
}
}
SmartLifecycle 解读
org.springframework.context.SmartLifecycle解读
1、接口定义
public interface SmartLifecycle extends Lifecycle, Phased {
boolean isAutoStartup();
void stop(Runnable callback);
}
从注释文档里可以看出:
1、是接口 Lifecycle 的拓展,且会在应用上下文类ApplicationContext 执行 refresh and/or shutdown 时会调用
2、方法 isAutoStartup() 返回的值会决定,当前实体对象是否会被调用,当应用上下文类ApplicationContext 执行 refresh
3、stop(Runnable) 方法用于调用Lifecycle的stop方法
4、getPhase() 返回值用于设置LifeCycle的执行优先度:值越小优先度越高
5、isRunning() 决定了start()方法的是否调用
2、应用
public class SmartLifecycleImpl implements SmartLifecycle {
private Boolean isRunning = false;
@Override
public boolean isAutoStartup() {
return true;
}
@Override
public void stop(Runnable callback) {
callback.run();
}
@Override
public void start() {
System.out.println("SmartLifecycleImpl is starting ....");
isRunning = true;
}
@Override
public void stop() {
System.out.println("SmartLifecycleImpl is stopped.");
}
@Override
public boolean isRunning() {
return isRunning;
}
@Override
public int getPhase() {
return 0;
}
}
启动类
public class ProviderBootstrap {
public static void main(String[] args) throws Exception {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ProviderConfiguration.class);
context.start();
System.in.read();
}
@Configuration
static class ProviderConfiguration {
@Bean
public SmartLifecycleImpl getSmartLifecycleImpl(){
return new SmartLifecycleImpl();
}
}
}
可以发现,类SmartLifecycleImpl提交给spring容器后,启动后,会输出 start() 方法的方法体。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。