IDEA 实现SpringBoot热部署(HotSwap和DevTools混用)

HotSwapSpring 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 APIInstrumentation.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

✅ 测试热部署

  1. 原来的代码
  1. 原代码接口请求结果
  1. 修改代码

将之前为空的一个字段设置为测试字符串

  1. ctrl f9或者点击Build Project进行热部署
  1. 热部署成功后编译器右下角会显示如下图内容代表成功了
  1. 仍然请求之前那个接口,发现我们通过修改代码设置参数通过热部署修改成功了

⚠ 实现自动编译

要注意,需要焦点从 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.xmlbuild.gradle 加上依赖:
xml 复制代码
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-devtools</artifactId>
  <scope>runtime</scope>
</dependency>
  • 配置文件里默认开启:
properties 复制代码
spring.devtools.restart.enabled=true
  • 避免冲突
  • 让 DevTools 专注于 大改动和静态资源刷新
  • 如果 DevTools 频繁重启,可以在 application.properties 微调:
properties 复制代码
# 排除掉某些改动,避免触发重启
spring.devtools.restart.exclude=static/**,public/**
  • 这样 HTML/JS/CSS 只刷新,不触发重启。

🔥 使用姿势 (混用一点要看)

  1. 修改方法逻辑(小改动)

    • Build Project
    • IDEA 会 HotSwap → JVM 立即生效
    • DevTools 也会监听到 class 变化,但 Hotswap 已经让改动生效了,你不需要管它。
  2. 新增字段、修改方法签名(大改动)

    • Build Project
    • Hotswap 注入失败(受限于 JVM HotSwap API)
    • DevTools 监听到 class 文件变化 → 自动快速重启,生效
  3. 改模板/静态资源

    • 保存文件
    • DevTools 会自动刷新页面,无需重启

👉 总结:
混用方式 = IDEA HotSwap 负责小改动即时生效,DevTools 负责兜底大改动和前端资源刷新。
触发动作还是同一个(Build Project),只不过两者接管不同的场景。

相关推荐
haokan_Jia2 小时前
【MyBatis-Plus 动态数据源的默认行为】
java·开发语言·mybatis
小信丶3 小时前
Spring 6 的 @HttpExchange 注解:声明式 HTTP 客户端的现代化利器
java·spring·http
野犬寒鸦5 小时前
多级缓存架构:性能与数据一致性的平衡处理(原理及优势详解+项目实战)
java·服务器·redis·后端·缓存
帧栈8 小时前
开发避坑指南(58):Java Stream 按List元素属性分组实战指南
java
Da Da 泓8 小时前
LinkedList模拟实现
java·开发语言·数据结构·学习·算法
海琴烟Sunshine8 小时前
Leetcode 14. 最长公共前缀
java·服务器·leetcode
城管不管8 小时前
Lambda
java
龙茶清欢9 小时前
5、urbane-commerce 微服务统一依赖版本管理规范
java·运维·微服务
海琴烟Sunshine11 小时前
Leetcode 26. 删除有序数组中的重复项
java·算法·leetcode