概要
アプリケーション起動時に、1回だけ処理を実行する方法についてまとめた。
例えば以下のようなケースで使用する。
・DBのマスタ情報やプロパティ値を取得してメモリ上で保持する
など
実装
「org.springframework.beans.factory.SmartInitializingSingleton」インターフェースを実装する。
※SmartInitializingSingletonは、spring-beans(spring-webmvcの内部に含む)ライブラリの中にある。
初期化処理
SmartInitializingSingletonを実装し、アプリ起動時に1度だけ実行したい初期化処理を定義する。
MasterLoader.java
package com.example.prototype.biz.app.initializer;
import java.util.List;
import org.springframework.beans.factory.SmartInitializingSingleton;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.example.prototype.biz.users.service.AuthorityMasterService;
import com.example.prototype.web.users.dto.AuthorityMasterDto;
@Component
public class MasterLoader implements SmartInitializingSingleton {
@Autowired
private AuthorityMasterService authorityMasterService;
/** 権限マスタ一覧 */
private List<AuthorityMasterDto> cachedAuthorityList;
/**
* すべてのシングルトンBeanの初期化完了後に実行
*/
@Override
public void afterSingletonsInstantiated() {
// 初期化
this.cachedAuthorityList = authorityMasterService.findAllActive();
}
/**
* 権限マスタ一覧取得
* @return
*/
public List<AuthorityMasterDto> getCachedAuthorityList() {
return cachedAuthorityList;
}
}
public class MasterLoader implements SmartInitializingSingleton {
SmartInitializingSingletonを実装したクラスを用意する。
DIコンテナでBeanを管理するため、コンポーネント化も行う。
public void afterSingletonsInstantiated() {
SmartInitializingSingletonにて定義されているメソッドをオーバーライドする。
このメソッドは、すべての非遅延シングルトンBeanが初期化された後に一度だけ実行される。
※@PostConstructが付与された初期化処理も終わったあとに実行される
this.cachedAuthorityList = authorityMasterService.findAllActive();
DBからマスタ情報を取得してstaticフィールドに保持している。
これにより、以降のマスタ情報取得処理にて、都度DBアクセスを実施する必要がなくなる。
まとめ
☑ アプリ起動時に一度だけ初期化処理を行いたい場合は、SmartInitializingSingletonを実装する
☑ 実装クラスはDIコンテナで管理される必要があるため、@Componentでコンポーネント化する
☑ すべての非遅延シングルトンBeanの依存注入(@PostConstructの初期化含む)が完了した後に、一度だけ処理が呼び出される