[SpringBoot] Describa brevemente los tres métodos de carga de datos de inicio del proyecto springboot en la memoria

I. Introducción

En términos generales, la configuración del entorno del proyecto SpringBoot se coloca en el archivo de propiedades y los elementos de configuración en el archivo de propiedades/yaml del proyecto se cargan en la memoria al inicio . Sin embargo, cuando los elementos de configuración se cambian de esta manera, es necesario volver a compilarlos e implementarlos. Teniendo en cuenta este factor, hoy presentaré los elementos de configuración almacenados en la tabla de la base de datos, y los elementos de configuración se cargarán en la memoria cuando finalice el proyecto. empieza.

SpringBoot proporciona dos interfaces:  CommandLineRunner  y  ApplicationRunner  . Al implementar la interfaz, los datos de la base de datos se pueden cargar en la memoria cuando se inicia el proyecto. Los escenarios utilizados son: cargar elementos de configuración en la memoria; cargar datos de diccionario o lista blanca en la memoria (o almacenar en caché en Redis ) al inicio.

2. Método de carga

El primero: use la anotación @PostConstruct (propiedades/archivo yaml).

La segunda: usa la anotación @Order y la interfaz CommandLineRunner .

La tercera forma: use la anotación @Order y la interfaz ApplicationRunner .

Precauciones

Los javadocs oficiales del segundo y tercer tipo son los mismos, la diferencia es que los parámetros recibidos son diferentes. Los parámetros de CommandLineRunner son los parámetros más primitivos sin ningún procesamiento. El parámetro de ApplicationRunner es ApplicationArguments , que encapsula aún más los parámetros originales.

3. Ejemplo de código

3.1 Usando la anotación @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  Interfaz 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  Interfaz de 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));
        }
    }
}

Cuatro Resumen

1. El momento de llamar a CommandLineRunner y ApplicationRunner es inmediatamente después de que se complete la inicialización del contenedor.

2. No hay diferencia entre CommandLineRunner y ApplicationRunner en uso. La única diferencia es que CommandLineRunner acepta parámetros de matriz de cadenas y necesita analizar la clave y el valor por sí mismo. El parámetro de ApplicationRunner es ApplicationArguments , que es un paquete adicional del original parámetros

3. Ambas interfaces pueden usar  el parámetro @Order para  respaldar el orden de llamada de acuerdo con el valor de peso declarado en orden  después de que comience el proyecto (cuanto menor sea el número, mayor será la prioridad).

¡fin!

Supongo que te gusta

Origin blog.csdn.net/weixin_44299027/article/details/128973408
Recomendado
Clasificación