InitializingBean的作用:参见
spring中的DisposableBean,ApplicationContextAware的用法:参见
import org.springframework.context.SmartLifecycle;
import org.springframework.stereotype.Component;
@Component
public class Test implements SmartLifecycle {
private boolean isRunning = false;
/**
* 1.在该方法中启动任务或者其他异步服务,比如开启MQ接收消息
* 2.当上下文被刷新时,将调用该方法
* 3.isAutoStartup方法返回true时Spring启动时才会自动调用start
*/
@Override
public void start() {
System.out.println("start");
...
// 执行完其他业务后,可以修改 isRunning = true
isRunning = true;
}
/**
* 如果工程中有多个实现接口SmartLifecycle的类,则这些类的
* start的执行顺序按getPhase方法返回值从小到大执行,stop方法的执行顺序则相反<br/>
*/
@Override
public int getPhase() {
// 默认为0
return 0;
}
@Override
public boolean isAutoStartup() {
// 默认为false
return true;
}
@Override
public boolean isRunning() {
// 默认返回false
return isRunning;
}
/**
* SmartLifecycle子类的才有的方法,当isRunning方法返回true时,该方法才会被调用。
*/
@Override
public void stop(Runnable callback) {
System.out.println("stop(Runnable)");
// 如果你让isRunning返回true,需要执行stop这个方法,那么就不要忘记调用callback.run()。
// 否则在你程序退出时,Spring的DefaultLifecycleProcessor会认为你这个TestSmartLifecycle没有stop完成,程序会一直卡着结束不了,等待一定时间(默认超时时间30秒)后才会自动结束。
callback.run();
isRunning = false;
}
/**
* 接口Lifecycle的子类的方法,只有非SmartLifecycle的子类才会执行该方法。<br/>
* 1. 该方法只对直接实现接口Lifecycle的类才起作用,对实现SmartLifecycle接口的类无效。<br/>
* 2. 方法stop()和方法stop(Runnable callback)的区别只在于,后者是SmartLifecycle子类的专属。
*/
@Override
public void stop() {
System.out.println("stop");
isRunning = false;
}