В каком состоянии пружинные крючки запуска/остановки жизненного цикла вызова?


Я пытаюсь понять логику интерфейса Lifecycle. Документация для Lifecycle гласит:

Контейнеры будут распространять сигналы запуска / остановки на все компоненты, которые применитесь внутри каждого контейнера, например для сценария остановки / перезапуска на во время выполнения.

Но, похоже, что cantainer вообще не вызывает эти методы (start/stop).

Например, результатом для следующего фрагмента кода является только один вывод "> > call: is running: 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 и это прекрасно работает. Но мне интересно, как мы можем правильно использовать методы start/stop из Lifecycle.

1 4

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();
  }
}