2016-06-25 1 views
4

Lifecycle 인터페이스 로직을 이해하려고합니다. Lifecycle에 대한 문서는 말한다 :Spring Call Lifecycle의 시작/중지 후크는 어떤 조건입니까?

예를 들어, 각 컨테이너 내에서 적용 모든 구성 요소에 신호를 시작/전파 중지

컨테이너 중지/재시작 시나리오의 경우 런타임.

하지만 cantainer는이 방법 (시작/중지)을 전혀 호출하지 않는 것으로 보입니다.

예를 들어 다음 코드에 대한 결과는 하나의 출력은 ">> 전화 : 실행 : 거짓"

@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

스프링 설명서는 말한다 : "를 SmartLifecycle 확장주의, 수명주기의 인터페이스는 다른 구성 요소에서 라이프 사이클 인터페이스는 또한 발견되지 않은 따라서 무시 남아 최상위 싱글 콩에 지원됩니다.. 인터페이스는 애플리케이션 컨텍스트의 시작 및 종료 단계와의 통합을 제공합니다. " 구성 클래스에서 사용하기 때문에 작동하지 않을 수 있습니까? Bean 클래스에서 시도해 보길 권한다. – niekname

답변

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(); 
    } 
} 
관련 문제