@liruiyi962464
2025-07-26T07:50:52.000000Z
字数 3012
阅读 54
代码
特性 | 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;
@Component
public class RedisDataLoaderWithCommandLineRunner implements CommandLineRunner {
@Autowired
private ZcTrainMapper zcTrainMapper;
@Autowired
private RedisUtil redisUtil;
@Override
public void run(String... args) throws Exception {
// 缓存列车数据到 Redis
loadTrainDataToRedis();
}
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);
}
}
// 存入 Redis
redisUtil.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;
@Component
public class RedisDataLoaderWithApplicationListener implements ApplicationListener<ApplicationReadyEvent> {
@Autowired
private ZcTrainMapper zcTrainMapper;
@Autowired
private RedisUtil redisUtil;
@Override
public void onApplicationEvent(ApplicationReadyEvent event) {
// 缓存列车数据到 Redis
loadTrainDataToRedis();
}
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);
}
}
// 存入 Redis
redisUtil.set("zcTrainMap", zcTrainMap);
System.out.println("列车数据已加载到 Redis,键为: zcTrainMap");
}
}
ApplicationListener<ApplicationReadyEvent>
监听 ApplicationReadyEvent
事件,该事件在 Spring Boot 应用完全启动后触发。"zcTrainMap"
。