2016-06-25 7 views
4

私はLifecycleインターフェイスロジックを理解しようとしています。 Lifecycleため ドキュメントは言う:どのような条件でSpringコールライフサイクルの開始/停止フックですか?

コンテナは、例えば、各コンテナ内適用 すべてのコンポーネントに信号をスタート/ストップを伝播します停止/再起動シナリオの場合は 実行時です。

しかし、cantainerはこのメソッド(開始/停止)をまったく呼び出さないようです。

たとえば、次のコードスニペットのための結果は単一の出力 ">>コール:実行されている: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

春のドキュメントも言う:「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(); 
    } 
} 
関連する問題