【Spring MVC】アプリケーション起動時に1回だけ処理を実行する方法

概要

アプリケーション起動時に、1回だけ処理を実行する方法についてまとめた。
例えば以下のようなケースで使用する。

・初期化したBeanをログに出力する
・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;
    }
}

 

@Component
public class MasterLoader implements SmartInitializingSingleton {

SmartInitializingSingletonを実装したクラスを用意する。
DIコンテナでBeanを管理するため、コンポーネント化も行う。

 

@Override
public void afterSingletonsInstantiated() {

SmartInitializingSingletonにて定義されているメソッドをオーバーライドする。
このメソッドは、すべての非遅延シングルトンBeanが初期化された後に一度だけ実行される。
※@PostConstructが付与された初期化処理も終わったあとに実行される

 

// 初期化
this.cachedAuthorityList = authorityMasterService.findAllActive();

DBからマスタ情報を取得してstaticフィールドに保持している。
これにより、以降のマスタ情報取得処理にて、都度DBアクセスを実施する必要がなくなる。

 

 

まとめ

 

☑ アプリ起動時に一度だけ初期化処理を行いたい場合は、SmartInitializingSingletonを実装する

☑ 実装クラスはDIコンテナで管理される必要があるため、@Componentでコンポーネント化する

☑ すべての非遅延シングルトンBeanの依存注入(@PostConstructの初期化含む)が完了した後に、一度だけ処理が呼び出される

スポンサーリンク