1. SpringBoot启动后执行方法的常见场景
在SpringBoot应用开发中,我们经常需要在应用启动完成后执行一些初始化操作。这些场景包括但不限于:
- 数据库初始化:创建表结构或导入基础数据
- 缓存预热:加载高频访问数据到Redis等缓存系统
- 连接池初始化:预先建立数据库连接池
- 定时任务启动:初始化Quartz或@Scheduled任务
- 外部服务注册:向注册中心(如Nacos)注册服务
- 配置文件校验:检查关键配置项是否合法
- 资源加载:加载词典、模型等静态资源(如HanLP分词)
这些操作如果放在普通方法中直接调用,可能会因为Spring容器尚未完全初始化而导致各种异常。SpringBoot提供了多种机制来确保这些方法在合适的时机执行。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 实现启动后执行的5种核心方式
2.1 CommandLineRunner接口
这是最常用的方式之一,实现简单且功能强大:
java复制@Component
@Order(1) // 可指定执行顺序
public class MyRunner implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
// 在这里编写启动后要执行的代码
System.out.println("应用启动完成,开始执行初始化...");
}
}
特点:
- 多个Runner可以通过@Order控制执行顺序
- 能获取到main方法的原始参数(args)
- 执行时机:在ApplicationContext完全初始化之后,但在SpringApplication.run()完成之前
2.2 ApplicationRunner接口
与CommandLineRunner类似,但提供了更丰富的参数处理:
java复制@Component
public class MyAppRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
// 可以获取更结构化的参数信息
System.out.println("非选项参数: " + args.getNonOptionArgs());
System.out.println("选项参数: " + args.getOptionNames());
}
}
优势:
- 参数被封装为ApplicationArguments对象,便于解析
- 支持区分选项参数(--开头的)和非选项参数
- 同样支持@Order注解控制顺序
