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

✅ 测试热部署

  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.xml 或 build.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),只不过两者接管不同的场景。

相关推荐
小羊没烦恼!4 天前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
俊昭喜喜里4 天前
java中的继承和多态的区别
java
小羊没烦恼!4 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
譕痕4 天前
JSONObject与JSONArray封装数据格式区别
java·json
胡写代码4 天前
别再前后端各写一套表单校验了
java·后端
小鱼能吃糖4 天前
缺陷修复总览 · mall电商项目:5类缺陷,1个病根,4个业务域
java·电商
此时不提桶,更待何时4 天前
01-06-A-JVM排查实战详解
java·jvm
vipxieliang4 天前
ValidX 在 DDD 领域驱动设计中的实践
java·spring boot
ba_pi4 天前
mysql 查询所有表名并授权
java
ProcessOn官方账号4 天前
java函数式编程--入门基础
java·编程·函数式编程