我使用Spring SmartLifeCycle来指定bean顺序如下:
public class MyBean implements SmartLifecycle {
@PostConstruct
public void init() {
//Do stuff
}
private boolean isRunning = false;
@Override
public boolean isAutoStartup() {
LOGGER.warn("************** is autostartp");
return true;
}
@Override
public void stop(final Runnable callback) {
stop();
callback.run();
}
@Override
public void start() {
LOGGER.warn("************** start ");
isRunning = true;
}
@Override
public void stop() {
LOGGER.warn("************** stop");
isRunning = false;
}
@Override
public boolean isRunning() {
LOGGER.warn("************** is running" + isRunning);
return isRunning;
}
@Override
public int getPhase() {
LOGGER.warn("************** phase " + (Integer.MIN_VALUE));
return Integer.MIN_VALUE;
}
}
订单似乎没有正确运行。所有bean似乎都是在甚至考虑阶段之前构建的,这是由应用程序启动失败引起的。
如何解决此问题并正确指定订单?我错误地使用了这个吗?
答案 0 :(得分:0)
看起来你错过了getPhase()方法。这用于控制bean实例化的顺序。在关机期间,订单相反。
任何没有显式阶段的bean都被分配了阶段0(最常见)或者由Spring给出了一个阶段(如果它是由Spring管理的事情,就像JMS监听器一样)。
除非你明确指定一个阶段,否则Spring会做出“最佳猜测”,这可能无法产生预期的结果。
@Override
public int getPhase() {
return 1;
}