当前位置: 首页 > news >正文

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

HotSwapSpring Boot DevTools的区别

特性HotswapDevTools
类型JVM 层字节码替换Spring Boot 工具
原理JVM HotSwap API / 插件增强类加载器隔离 + 快速重启
支持范围方法体内代码(增强后支持更多)全局代码、配置、模板、静态资源
速度极快(不用重启 JVM)快于手动重启,但还是重启
工具IDEA Built-in、JRebel、HotswapAgentSpring 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 加上依赖:
<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 只刷新,不触发重启。

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

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

http://www.dtcms.com/a/410391.html

相关文章:

  • 《IDEA 2025 长效使用指南:2099 年有效期配置实战之JetBrains全家桶有效》​
  • IntelliJ IDEA / Android Studio 里直接跑 Cursor(不用来回切窗口)
  • HarmonyOS应用前后台状态切换
  • 网站建设app销售好做吗哪里长沙网站开发
  • pdf文件根据页数解析成图片 js vue3
  • Http与WebSocket
  • AI 赋能 EMS 微电网能效管理平台:构建分布式能源的智能调控中枢
  • 内网信息收集与命令详解
  • 电茶炉方案开发,茶炉板MCU控制方案分析
  • React Zustand 学习笔记(对照Vue3)
  • PyTorch实现CIFAR-10图像分类:从数据加载到模型训练全流程
  • 鸿蒙应用内存优化全攻略:从泄漏排查到对象池实战
  • ReactUse 与ahook对比
  • 网站建设与维护属于什么岗位wordpress免费企业站主题
  • 长安网站设计仿照别的网站做
  • 如何快速定位bug,编写测试用例?
  • 【LeetCode 142】环形链表 II:寻找环的入口
  • 卷轴 缓冲绘制 超级玛丽demo5
  • 1.9 IP地址和Mac地址
  • C# WinForms的入门级画板实现
  • 云南网站建设方案简述营销型网站开发流程
  • 随时随地学算法:Hello-Algo与cpolar的远程学习方案
  • App 上架全流程指南,iOS 应用发布步骤、ipa 文件上传工具、TestFlight 分发与 App Store 审核经验分享
  • 网站建设公司推荐常德网站开发服务
  • 全球知名的Java Web开发平台Vaadin上线慧都网
  • 【QT】高级主题
  • 详细对比web请求post和put的区别
  • dedecms 营销网站模板免费下载专业设计网址青岛网站开发
  • 正在招 | 2025.9 福建 IT 相关岗位招聘信息
  • 树莓派4B+ubuntu20.04:不插显示器能不能正常开机?