Spring在什么条件下调用Lifecycle的启动/停止挂钩?

时间:2016-06-25 17:18:31

标签: java spring configuration lifecycle applicationcontext

我试图理解Lifecycle接口逻辑。 Lifecycle的文档说:

  

容器会将启动/停止信号传播到所有组件   适用于每个容器,例如用于停止/重启场景   运行时。

但似乎cantainer根本没有调用这种方法(开始/停止)。

例如,下一个代码段的结果只是单个输出">> call:正在运行:false"

@Configuration
public class TestApp implements Lifecycle {

    boolean runStatus = false;

    @Override
    public void start() {
        System.err.println(">> call: start (Lifecycle)");
        runStatus = true;
    }

    @Override
    public void stop() {
        System.err.println(">> call: stop (Lifecycle)");
        runStatus = false;
    }

    @Override
    public boolean isRunning() {
        System.err.println(">> call: is running: " + runStatus);
        return runStatus;
    }

    public static void main(String[] args) {
        AbstractApplicationContext ctx = new AnnotationConfigApplicationContext(TestApp.class);
        ctx.stop();
    }
}

P.S。我听说过SmartLifecycle,它运行正常。但我对如何正确使用Lifecycle中的启动/停止方法感兴趣。

1 个答案:

答案 0 :(得分:1)

您应该手动start()stop()上下文。

@Configuration
 public class TestApp implements Lifecycle {

  boolean runStatus = false;

  public TestApp (){}


  @Bean
  public TestApp testApp(){
    return new TestApp();
  }

  @Override
  public void start() {
    System.err.println(">> call: start (Lifecycle)");
    runStatus = true;
  }

  @Override
  public void stop() {
    System.err.println(">> call: stop (Lifecycle)");
    runStatus = false;
  }

  @Override
  public boolean isRunning() {
    System.err.println(">> call: is running: " + runStatus);
    return runStatus;
  }

  public static void main(String[] args) {
    AbstractApplicationContext ctx = new AnnotationConfigApplicationContext(TestApp.class);
    ctx.start();
    TestApp ta = ctx.getBean(TestApp.class);
    ctx.stop();
  }
}