SpringBoot 项目启动时执行初始化的 5 种常用方案
SpringBoot 提供了多种项目启动后自动执行初始化逻辑的方式,适用于不同场景(加载配置、初始化数据、预热缓存、启动定时任务等)。
1. 推荐首选:CommandLineRunner 接口(最简单)
适用场景:简单的初始化逻辑,无依赖顺序要求。
特点:实现接口 + 重写 run 方法,SpringBoot 启动完成后自动调用。
1 | import org.springframework.boot.CommandLineRunner; |
2. 带顺序执行:ApplicationRunner 接口
适用场景:需要解析启动参数、多个初始化类需要指定执行顺序。
用法和 CommandLineRunner 几乎一致,参数更强大。
1 | import org.springframework.boot.ApplicationArguments; |
3. 注解方式:@PostConstruct(Bean 初始化时执行)
适用场景:某个 Bean 被创建后立即执行初始化(比上面两种更早)。
注意:执行时机是 Bean 初始化完成,不是整个项目启动完成。
1 | import javax.annotation.PostConstruct; |
4. 监听启动事件:ApplicationListener<ApplicationReadyEvent>
适用场景:Spring 容器完全启动就绪后执行(最靠后、最安全)。
1 | import org.springframework.boot.context.event.ApplicationReadyEvent; |
5. 静态代码块:static {}(不推荐)
适用场景:类加载时执行,无法使用 Spring 注入的 Bean(不能用 @Autowired)。
缺点:脱离 Spring 容器管理,只能做纯静态初始化。
1 | public class StaticInit { |
执行时机顺序(重要)
SpringBoot 启动时执行顺序:
static{}静态代码块@PostConstruct(Bean 初始化)CommandLineRunner/ApplicationRunnerApplicationReadyEvent(应用完全就绪)
如何选择?
| 方式 | 优点 | 推荐场景 |
|---|---|---|
| CommandLineRunner | 最简单、通用 | 绝大多数初始化场景 |
| ApplicationRunner | 支持参数、顺序 | 需要解析启动参数 |
| @PostConstruct | Bean 级初始化 | 单个 Bean 内部初始化 |
| 事件监听 | 最靠后、最安全 | 必须等项目完全就绪 |
- 日常开发首选
CommandLineRunner,简单稳定; - 多个初始化类需要排序,用
@Order(数字); - 必须等项目完全启动成功再执行,用
ApplicationReadyEvent; - 不要用静态代码块做依赖 Spring 的初始化。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 崔安兵的博客!
评论

