【SpringBoot】springbootプロジェクトの起動データをメモリにロードする3つの方法を簡単に説明

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. CommandLineRunnerApplicationRunnerを呼び出すタイミングは、コンテナの初期化が完了した直後です。

2.使用中のCommandLineRunnerApplicationRunnerの間に違いはありません. 唯一の違いは、 CommandLineRunner が文字列配列パラメーターを受け入れ、キーと値をそれ自体で解析する必要があることです. ApplicationRunnerのパラメーターはApplicationArgumentsであり、これはオリジナルの追加パッケージです.パラメーター。

3. どちらのインターフェースも @Order パラメーターを使用して、プロジェクト開始後に順番 に宣言された重み値に従って呼び出しの順序をサポートできます(数値が小さいほど、優先度が高くなります)。

終わり!

おすすめ

転載: blog.csdn.net/weixin_44299027/article/details/128973408