【java】springboot项目启动数据加载内存中的三种方法
2023-09-14 09:14:20 时间
一、前言
一般来说,SpringBoot工程环境配置放在properties文件中,启动的时候将工程中的properties/yaml文件的配置项加载到内存中。但这种方式改配置项的时候,需要重新编译部署,考虑到这种因素,今天介绍将配置项存到数据库表中,在工程启动时把配置项加载到内存中。
SpringBoot提供了两个接口: CommandLineRunner 和 ApplicationRunner 。实现其中接口,就可以在工程启动时将数据库中的数据加载到内存。使用的场景有:加载配置项到内存中;启动时将字典或白名单数据加载到内存(或缓存到Redis中)。
二、加载方式
2.1、 第一种:使用@PostConstruct注解(properties/yaml文件)。
2.2、 第二种:使用@Order注解和CommandLineRunner接口。
2.3、 第三种:使用@Order注解和ApplicationRunner接口。
注意事项
第二种和第三种,二者的官方javadoc一样,区别在于接收的参数不一样。CommandLineRunner的参数是最原始的参数,没有做任何处理。ApplicationRunner的参数是ApplicationArguments,是对原始参数做了进一步的封装。
三、代码示例
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调用的时机是在容器初始化完成之后,立即调用。
4.2、CommandLineRunner和ApplicationRunner使用上没有区别,唯一区别是CommandLineRunner接受字符串数组参数,需要自行解析出健和值,ApplicationRunner的参数是ApplicationArguments,是对原始参数做了进一步的封装。
4.3、两个接口都可以使用 @Order 参数,支持工程启动后根据order 声明的权重值来决定调用的顺序(数字越小,优先级越高)。
相关文章
- Java 7与伪共享的新仇旧恨
- JAVA 注解教程(四)Java 预置的注解
- JAVA学习(四):Java流程控制语句(顺序结构、if条件语句、switch条件语句、循环语句与跳转语句)
- Java实现 蓝桥杯 算法提高 天天向上(DP)
- java实现 洛谷 P1056 排座椅
- java实现第五届蓝桥杯幂一矩阵
- Java实现第八届蓝桥杯迷宫
- Java实现 蓝桥杯 算法提高 7-1用宏求球的体积
- 【JAVA秒会技术之秒杀面试官】秒杀Java面试官——集合篇(一)
- java 11 标准Java异步HTTP客户端
- 【JAVA】java中的length和length()
- 使用Java标准的java.util.EventListener实现观察者-发布者设计模式
- Java java.util.concurrent.Future的一个例子
- 使用JDK自带的VisualVM进行Java程序的性能分析
- 如何使用Java构造层级结构的树形数据
- 【java】Java经典面试题整理(附答案)
- java死锁(Java-level deadlock)
- Java:Springboot的service循环依赖问题
- Java:Springboot整合PageHelper实现分页
- Java程序猿从笨鸟到菜鸟之(九十二)深入java虚拟机(一)——java虚拟机底层结构具体解释
- mysql-connector-java与Mysql、Java的对应版本
- JAVA学习第十九课(java程序的异常处理 (二))
- Java实现BASE64编解码
- 【JAVA面试必会】JMM高并发详解(java内存模型、JMM三大特征、volatile关键字 )
- 基于Java+SpringBoot+Vue前后端分离驾校管理系统设计与实现(有视频讲解)
- 基于Java+SpringBoot+Vue前后端分离图书借阅系统设计与实现(有视频讲解)
- 基于Java+SpringBoot+Vue前后端分离人事管理系统设计与实现
- 基于Java+SpringBoot+Vue前后端分离电影院售票订票系统设计与实现(有演示视频)