IDEA 实现SpringBoot热部署(HotSwap和DevTools混用)
HotSwap 和 Spring Boot DevTools的区别
特性 | Hotswap | DevTools |
---|---|---|
类型 | JVM 层字节码替换 | Spring Boot 工具 |
原理 | JVM HotSwap API / 插件增强 | 类加载器隔离 + 快速重启 |
支持范围 | 方法体内代码(增强后支持更多) | 全局代码、配置、模板、静态资源 |
速度 | 极快(不用重启 JVM) | 快于手动重启,但还是重启 |
工具 | IDEA Built-in、JRebel、HotswapAgent | Spring Boot 内置(spring-boot-devtools ) |
🔹 1. Hotswap
- 作用:在应用运行时替换修改过的类,而不用重启整个 JVM。
- 机制:利用 JVM 的 HotSwap API(
Instrumentation.redefineClasses
)。 - 限制:
- 只能修改方法体(方法内部的逻辑)。
- 不能修改方法签名、类的字段、注解、继承结构。
- IDEA 自带 Built-in HotSwap 就是这个能力;想突破限制需要用 JRebel / HotswapAgent 之类的增强工具。
- 场景:改一点点逻辑(比如 if 条件、打印日志),直接替换字节码,马上生效。
🔹 2. Spring Boot DevTools
- 作用:简化 Spring Boot 开发时的重启和热部署体验。
- 机制:
- 通过类加载器隔离(
restart
classloader),当 classpath 下的类文件变化时,触发应用重启(比手工重启快很多)。 - 静态资源(HTML、JS、CSS)支持 自动刷新(无需重启)。
- 通过类加载器隔离(
- 限制:
- 并不是完全的 hotswap,而是“快速重启”。
- 类文件改动还是会触发重启,只是速度快(因为没有重新加载第三方依赖)。
- 场景:改 Controller、Service、配置文件、模板、静态资源等,想让整个 Spring Boot 应用快速刷新。
✅ IDEA开启HotSwap
✅ 测试热部署
- 原来的代码
- 原代码接口请求结果
- 修改代码
将之前为空的一个字段设置为测试字符串
- ctrl f9或者点击Build Project进行热部署
- 热部署成功后编译器右下角会显示如下图内容代表成功了
- 仍然请求之前那个接口,发现我们通过修改代码设置参数通过热部署修改成功了
⚠ 实现自动编译
要注意,需要焦点从 IDEA 离开。例如说,在我们修改完接口的代码之后,可能会切换到浏览器或者 Postman 对该接口进行测试,此时 IDEA 就会自动更新代码和资源,进行热部署。
- 配置自动编译如下图,本人IDEA为2025可能配置页面有些许区别
- 触发时机: 焦点从 IDEA 离开
- 🙅但是我不建议用自动编译,因为可能我们会时不时的将焦点离开IDEA,去查资料或者写文档每次都重新热部署的话可能会造成卡顿,建议手动操作
🔥 进阶 Hotswap + DevTools 混用
🔹 小贴士
- 如果你用了 JRebel / HotswapAgent:它们能覆盖大部分结构性改动 → DevTools 的“快速重启”用处就小了,更多只剩下静态资源刷新。
- 如果只用 IDEA 内置 Hotswap:DevTools 的兜底作用就很重要。
🔹 核心思路
- 编译触发点相同 → 都是 Build Project / Make Project。
- 响应方式不同:
- Hotswap → 尝试把修改注入运行 JVM,不用重启。
- DevTools → 监听到 class 文件变化,如果 Hotswap 没覆盖,就触发快速重启。
👉 所以“混用”的关键,就是:
- 小改动(Hotswap能搞定) → 不依赖 DevTools 重启。
- 大改动(Hotswap失败) → DevTools 自动兜底。
🔹 IDEA 配置
启用 Hotswap
Settings -> Build, Execution, Deployment -> Debugger -> HotSwap
- 选 Always reload classes(或者
Ask
)。 - 这样每次 Build Project 编译后,IDEA 会尝试 HotSwap。
启用 DevTools
- 在
pom.xml
或build.gradle
加上依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope>
</dependency>
- 配置文件里默认开启:
spring.devtools.restart.enabled=true
- 避免冲突
- 让 DevTools 专注于 大改动和静态资源刷新。
- 如果 DevTools 频繁重启,可以在
application.properties
微调:
# 排除掉某些改动,避免触发重启
spring.devtools.restart.exclude=static/**,public/**
- 这样 HTML/JS/CSS 只刷新,不触发重启。
🔥 使用姿势 (混用一点要看)
-
修改方法逻辑(小改动)
- 点 Build Project
- IDEA 会 HotSwap → JVM 立即生效
- DevTools 也会监听到 class 变化,但 Hotswap 已经让改动生效了,你不需要管它。
-
新增字段、修改方法签名(大改动)
- 点 Build Project
- Hotswap 注入失败(受限于 JVM HotSwap API)
- DevTools 监听到 class 文件变化 → 自动快速重启,生效
-
改模板/静态资源
- 保存文件
- DevTools 会自动刷新页面,无需重启
👉 总结:
混用方式 = IDEA HotSwap 负责小改动即时生效,DevTools 负责兜底大改动和前端资源刷新。
触发动作还是同一个(Build Project),只不过两者接管不同的场景。