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!