@liruiyi962464
2025-07-26T07:50:52.000000Z
字数 3012
阅读 78
代码
| 特性 | CommandLineRunner |
ApplicationListener<ApplicationReadyEvent> |
|---|---|---|
| 触发时机 | Spring Boot 启动完成后,但应用可能未完全就绪 | Spring Boot 应用完全启动后,所有 Bean 已初始化 |
| 适用场景 | 需要尽早执行初始化逻辑,不依赖其他 Bean 的完全就绪 | 需要确保所有 Bean 已初始化后再执行逻辑 |
| 代码简洁性 | 更简洁,直接实现 run 方法 |
需要实现接口方法 onApplicationEvent |
| 执行顺序 | 可以通过 @Order 注解控制执行顺序 |
同样可以通过 @Order 注解控制执行顺序 |
CommandLineRunner。ApplicationListener<ApplicationReadyEvent>。CommandLineRunner 和 ApplicationListener 两种方式实现 Spring Boot 启动后热加载数据到 Redis 的示例代码:CommandLineRunner 实现热加载数据
import org.jeecg.common.util.RedisUtil;import org.jeecg.modules.train.entity.ZcTrain;import org.jeecg.modules.train.mapper.ZcTrainMapper;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.CommandLineRunner;import org.springframework.stereotype.Component;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;@Componentpublic class RedisDataLoaderWithCommandLineRunner implements CommandLineRunner {@Autowiredprivate ZcTrainMapper zcTrainMapper;@Autowiredprivate RedisUtil redisUtil;@Overridepublic void run(String... args) throws Exception {// 缓存列车数据到 RedisloadTrainDataToRedis();}private void loadTrainDataToRedis() {// 查询所有列车数据List<ZcTrain> zcTrainList = zcTrainMapper.selectList(null);// 按列车编号分组Map<String, List<ZcTrain>> zcTrainMap = new HashMap<>();if (zcTrainList != null && !zcTrainList.isEmpty()) {for (ZcTrain zcTrain : zcTrainList) {zcTrainMap.computeIfAbsent(zcTrain.getTrainNum(), k -> new ArrayList<>()).add(zcTrain);}}// 存入 RedisredisUtil.set("zcTrainMap", zcTrainMap);System.out.println("列车数据已加载到 Redis,键为: zcTrainMap");}}
CommandLineRunner 是一个函数式接口,实现 run 方法,在 Spring Boot 启动完成后自动执行。"zcTrainMap"。ApplicationListener 实现热加载数据
import org.jeecg.common.util.RedisUtil;import org.jeecg.modules.train.entity.ZcTrain;import org.jeecg.modules.train.mapper.ZcTrainMapper;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.context.event.ApplicationReadyEvent;import org.springframework.context.ApplicationListener;import org.springframework.stereotype.Component;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;@Componentpublic class RedisDataLoaderWithApplicationListener implements ApplicationListener<ApplicationReadyEvent> {@Autowiredprivate ZcTrainMapper zcTrainMapper;@Autowiredprivate RedisUtil redisUtil;@Overridepublic void onApplicationEvent(ApplicationReadyEvent event) {// 缓存列车数据到 RedisloadTrainDataToRedis();}private void loadTrainDataToRedis() {// 查询所有列车数据List<ZcTrain> zcTrainList = zcTrainMapper.selectList(null);// 按列车编号分组Map<String, List<ZcTrain>> zcTrainMap = new HashMap<>();if (zcTrainList != null && !zcTrainList.isEmpty()) {for (ZcTrain zcTrain : zcTrainList) {zcTrainMap.computeIfAbsent(zcTrain.getTrainNum(), k -> new ArrayList<>()).add(zcTrain);}}// 存入 RedisredisUtil.set("zcTrainMap", zcTrainMap);System.out.println("列车数据已加载到 Redis,键为: zcTrainMap");}}
ApplicationListener<ApplicationReadyEvent> 监听 ApplicationReadyEvent 事件,该事件在 Spring Boot 应用完全启动后触发。"zcTrainMap"。