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

相关推荐
ID_180079054731 分钟前
Python 实现亚马逊商品详情 API 数据准确性校验(极简可用 + JSON 参考)
java·python·json
devpotato11 分钟前
Spring Boot mTLS 报 `keystore password was incorrect`:不一定是密码错了
spring boot·tls·pkcs12·mtls
c++之路21 分钟前
C++23概述
java·c++·c++23
专注API从业者1 小时前
Open Claw 京东商品监控选品实战:一键抓取、实时监控、高效选品
java·服务器·数据库
摇滚侠2 小时前
DBeaver 导入数据库 导入 SQL 文件 MySQL 备份恢复
java·数据库·mysql
keep one's resolveY2 小时前
SpringBoot实现重试机制的四种方案
java·spring boot·后端
天空属于哈夫克32 小时前
企业微信API常见的错误和解决方案
java·数据库·企业微信
摇滚侠3 小时前
VMvare 虚拟机 Oracle19c 安装步骤,远程连接 Oracle19c,百度网盘安装包
java·oracle
梁萌3 小时前
idea报错找不到XX包的解决方法
java·intellij-idea·启动报错·缺少包
Agent产品评测局3 小时前
生产排期与MES/ERP系统打通,实操方法详解 —— 2026企业级智能体自动化选型与实战指南
java·运维·人工智能·ai·chatgpt·自动化