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

相关推荐
oak隔壁找我1 分钟前
公司级 Maven Parent POM 设计指南
java·后端
zl97989914 分钟前
SpringBoot-Web开发之内容协商
java·spring boot
李昊哲小课14 分钟前
spring 中 HttpStatus 与 ResponseEntity
spring boot·后端·spring·http·spring cloud·restful
bb456b15 分钟前
Snipaste (截图贴图工具) 精准截图 中文免费版
java·工具·贴图
SimonKing40 分钟前
【开发者必备】Spring Boot 2.7.x:WebMvcConfigurer配置手册来了(三)!
java·后端·程序员
2301_8012522240 分钟前
前端框架Vue(Vue 的挂载点与 data 数据对象)
java·前端·javascript·vue.js·前端框架
ArabySide42 分钟前
【Spring Boot】深入浅出Spring Boot中的控制反转与依赖注入
java·spring boot·后端
shepherd11143 分钟前
破局延时任务(上):为什么选择Spring Boot + DelayQueue来自研分布式延时队列组件?
java·spring boot·后端
技术杠精1 小时前
Docker Swarm之Java 应用部署与平滑更新
java·docker·容器
beyond阿亮1 小时前
nacos支持MCP Server注册与发现
java·python·ai·nacos·mcp