I.はじめに
一般的に、SpringBootプロジェクトの環境構成はプロパティファイルに配置され、プロジェクト内のproperties/yamlファイル内の構成項目は、起動時にメモリに読み込まれます。ただし、このように構成項目を変更すると、再コンパイルしてデプロイする必要があるため、今回はデータベーステーブルに格納されている構成項目を紹介し、プロジェクト実行時に構成項目をメモリにロードします。開始します。
SpringBoot は、CommandLineRunner と ApplicationRunner の2 つのインターフェースを提供します 。インターフェースを実装することで、プロジェクトの開始時にデータベース内のデータをメモリにロードできます。使用されるシナリオは次のとおりです: 構成アイテムをメモリにロードする; 起動時にディクショナリまたはホワイトリスト データをメモリにロードする (またはRedisにキャッシュする)。
2. 積載方法
1 つ目: @PostConstruct アノテーション(properties/yaml ファイル) を使用します。
2 つ目: @Order アノテーションとCommandLineRunnerインターフェースを使用します。
3 番目の方法: @Order アノテーションとApplicationRunnerインターフェースを使用します。
予防
2 番目と 3 番目のタイプの公式のjavadocは同じですが、違いは受け取るパラメーターが異なることです。CommandLineRunnerのパラメーターは、処理を行わない最も基本的なパラメーターです。ApplicationRunnerのパラメーターはApplicationArgumentsで、元のパラメーターをさらにカプセル化します。
3. コード例
3.1 @PostConstruct アノテーションの使用
package com.example.demo.config;
import com.example.demo.service.ICodeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Component
public class InitData1 {
public static Map<Integer, String> codeMap = new HashMap<Integer, String>();
@Autowired
private ICodeService codeService;
@PostConstruct
public void init() {
System.out.println("示例1:加载codeMap中......");
// 查询数据库数据
List<String> codeList = codeService.listAll();
for (int i = 0; i < codeList.size(); i++) {
codeMap.put(i, codeList.get(i));
}
}
@PreDestroy
public void destroy() {
System.out.println("系统启动成功,codeMap加载完成!");
}
}
3.2 CommandLineRunnerインターフェイス
package com.example.demo.config;
import com.example.demo.service.ICodeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Component
@Order(1) // 初始化加载优先级,数字越小优先级越高
public class InitData2 implements CommandLineRunner {
public static Map<Integer, String> codeMap = new HashMap<Integer, String>();
@Autowired
private ICodeService codeService;
@Override
public void run(String... args) throws Exception {
System.out.println("示例2:加载codeMap中......");
// 查询数据库数据
List<String> codeList = codeService.listAll();
for (int i = 0; i < codeList.size(); i++) {
codeMap.put(i, codeList.get(i));
}
}
}
3.3 ApplicationRunnerインターフェース
package com.example.demo.config;
import com.example.demo.service.ICodeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Component
@Order(1) // 初始化加载优先级,数字越小优先级越高
public class InitData3 implements ApplicationRunner {
public static Map<Integer, String> codeMap = new HashMap<Integer, String>();
@Autowired
private ICodeService codeService;
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("示例3:加载codeMap中......");
// 查询数据库数据
List<String> codeList = codeService.listAll();
for (int i = 0; i < codeList.size(); i++) {
codeMap.put(i, codeList.get(i));
}
}
}
4.まとめ
1. CommandLineRunnerとApplicationRunnerを呼び出すタイミングは、コンテナの初期化が完了した直後です。
2.使用中のCommandLineRunnerとApplicationRunnerの間に違いはありません. 唯一の違いは、 CommandLineRunner が文字列配列パラメーターを受け入れ、キーと値をそれ自体で解析する必要があることです. ApplicationRunnerのパラメーターはApplicationArgumentsであり、これはオリジナルの追加パッケージです.パラメーター。
3. どちらのインターフェースも @Order パラメーターを使用して、プロジェクト開始後に順番 に宣言された重み値に従って呼び出しの順序をサポートできます(数値が小さいほど、優先度が高くなります)。
終わり!