Spring SmartLifeCycle似乎不适用于post构造

时间:2016-11-01 18:45:56

标签: java spring

我使用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似乎都是在甚至考虑阶段之前构建的,这是由应用程序启动失败引起的。

如何解决此问题并正确指定订单?我错误地使用了这个吗?

1 个答案:

答案 0 :(得分:0)

看起来你错过了getPhase()方法。这用于控制bean实例化的顺序。在关机期间,订单相反。

任何没有显式阶段的bean都被分配了阶段0(最常见)或者由Spring给出了一个阶段(如果它是由Spring管理的事情,就像JMS监听器一样)。

除非你明确指定一个阶段,否则Spring会做出“最佳猜测”,这可能无法产生预期的结果。

@Override
public int getPhase() {
    return 1;
}