背景

开发 Spring Boot 时,spring-boot-devtools 提供 快速重启 与 静态资源热刷新,常被误认为「和 IDE HotSwap 一样改 Java 就能生效」。本文说明它实际做什么,并与 开发期热替换、JPDA 区分。

Spring Boot 总览见 Spring Boot。

依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <scope>runtime</scope>
    <optional>true</optional>
</dependency>

仅在开发 classpath 使用;生产打包应排除(optional + 不打进 fat jar 的常见做法)。

两个 ClassLoader(Restart)

DevTools 默认启用 Restart:

ClassLoader 加载内容 变更时
base 第三方依赖(spring-boot-starter-* 等) 一般不 reload
restart 你的 target/classes 业务代码 监控到变更后 快速重启 应用上下文

「快速重启」不是 HotSpot 的 类热替换:而是 停掉当前 Spring 上下文再拉起,但 base ClassLoader 保留,比冷启动整个 JVM 快。

因此:

  • 改 业务 Java 类 → 触发 restart(仍是一次上下文重建,不是 JPDA 改方法体)
  • 改 静态资源(src/main/resources 下 html/css 等)→ LiveReload 通知浏览器刷新,无需重启 JVM

与 HotSwap / BTrace 的对比

机制 层级 典型场景
DevTools Restart Spring 上下文 + 双 ClassLoader 本地改代码后几秒内重新跑 Bean
IDE HotSwap JVM + JPDA / 有限 redefine Debug 下改 方法体
DCEVM + HotSwapAgent 增强 HotSpot + javaagent 开发机放宽 redefine、重载 Spring 配置
BTrace attach Attach + ASM 已运行 进程观测,非开发热更

DevTools 不 使用 Attach API 给业务类插探针;也 不 替代 mvn spring-boot:run 外的生产部署。

常用配置

# 关闭 Restart(只要 LiveReload 时)
spring.devtools.restart.enabled=false

# 额外监控路径
spring.devtools.restart.additional-paths=src/main/java

# 排除某些资源不触发 restart
spring.devtools.restart.exclude=static/**,public/**

IDEA 需开启 Build project automatically 并与 DevTools 配合,改代码后才会编译并触发 restart(具体以 IDE 版本为准)。

参考

维护记录

时间 修改内容 原因
2026-06-24 移至 language/java/spring/spring-boot-devtools.md;修正同目录内链路径 与 Spring 专题文章同目录归类