Springでコンポーネントの起動・停止処理(初期化・破棄処理)を実装する方法を調べてみました。
SmartLifecycleを実装する
起動・停止処理という切り口の場合は、SmartLifecycle
を利用するのが良さげっぽい。DIコンテナ起動時にstart
メソッドが呼び出され、DIコンテナ停止時にstop
メソッドが呼び出される。
@Component
public class MyComponent implements SmartLifecycle {
private boolean active;
@Override
public void start() {
System.out.println("start " + getClass());
this.active = true;
}
@Override
public void stop() {
System.out.println("stop " + getClass());
this.active = false;
}
@Override
public boolean isRunning() {
return active;
}
}
getPhase
メソッドをオーバライドすれば、起動・停止する順番(フェーズ)を制御することもできる。起動時は数値が小さいコンポーネントのメソッドから順に呼び出され、停止時は数値が大きいコンポーネントのメソッドから順に呼び出される。
@Override
public int getPhase() {
return 0;
}
Lifecycle
インタフェースを実装することで同じようなことはできるが順序(フェーズ)のサポートはない。
InitializingBean/DisposableBeanを実装する
InitializingBean
/DisposableBean
を実装することで同じようなことできそうだが、起動・停止処理というよりかは、コンポーネントの初期化・破棄処理を実装するためのインターフェースなので役割がちょっと違う気はします。
@Component
public class MyComponent implements InitializingBean, DisposableBean {
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("afterPropertiesSet " + getClass());
}
@Override
public void destroy() throws Exception {
System.out.println("destroy " + getClass());
}
}
まとめ
上記以外にも初期化・破棄処理を実装・実行する方法はありますが、今回はあえてSpringが提供するインタフェースを実装する方法に限定してみました。