springboot热部署

springboot热部署

springboot热部署是什么

Spring Boot 热部署是开发阶段提升代码迭代效率的核心特性,主要通过引入 spring-boot-devtools 开发工具模块实现,指在应用持续运行过程中,修改自研的业务代码、配置文件或静态资源后,无需手动停止并全量重启整个应用,仅对修改的项目代码快速重启的机制。

核心实现原理

Spring Boot DevTools 采用类加载器分层策略实现应用的按需重启,核心是将应用的类加载器划分为两个独立层级,以此规避全量重启带来的性能损耗,具体机制如下:

类加载器分层定义

  • 基础类加载器(Base ClassLoader):该类加载器负责加载应用运行所依赖的第三方库及 Spring Boot 核心类库,此类资源在开发阶段极少发生变更,因此一旦加载完成便会被永久缓存,不会随业务代码的修改重新加载。
  • 重启类加载器(Restart ClassLoader):该类加载器专门负责加载项目自研的业务代码、配置文件以及静态资源,这类资源是开发过程中高频修改的内容,也是按需重启机制的核心作用对象。

文件变更触发的按需重启流程

当 DevTools 监测到应用类路径(Maven 项目对应 "项目根目录 /target/classes" 目录)下的文件发生变更时,会按以下流程执行按需重启:

  1. 销毁当前运行的 Restart ClassLoader 实例,释放其加载的所有业务层类资源;
  2. 重新创建一个全新的 Restart ClassLoader 实例,加载类路径下最新的业务代码、配置文件及静态资源;
  3. 重启 Spring 应用上下文(ApplicationContext),该过程仅针对业务层上下文执行重启操作,Base ClassLoader 及其加载的第三方依赖、Spring Boot 核心类库保持原有状态,不会重新加载。

上述按需重启流程仅涉及业务层资源的重新加载与上下文重启,整体耗时通常仅数百毫秒,而全量重启需重新加载所有依赖,耗时远高于按需重启,因此该分层策略可显著提升开发阶段的代码迭代效率。

演示案例

引入依赖

xml 复制代码
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>

代码如下

java 复制代码
package com.qcby.springboot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class HelloWorldSpringBootMain {

    public static void main(String[] args) {
        SpringApplication.run(HelloWorldSpringBootMain.class, args);
    }

}
java 复制代码
package com.qcby.springboot.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class HelloController {
    @ResponseBody
    @RequestMapping("/hello")
    public String hello(){
        return "Hello World!";
    }
}

启动后的效果如下

修改java代码或者配置文件模板后通过按 ctrl+f9 来实施热部署

相关推荐
葫芦和十三6 小时前
图解 MongoDB 26|片键设计:决定集群命运的一个决定
后端·mongodb·agent
Avan_菜菜7 小时前
使用 Docker + rclone 自建 WebDAV
后端·agent·claude
小bo波9 小时前
Java Swing 图形用户界面实验 —— 从算术练习到游戏开发的完整实践
java·课程设计·gui·游戏开发·扫雷·swing
阳光是sunny9 小时前
别再被 worktree 绕晕了!AI 编程时代你必须掌握的 Git 隔离神器
前端·人工智能·后端
万少10 小时前
万少的博客 - 技术分享与解决方案
前端·javascript·后端
咖啡八杯10 小时前
GoF设计模式——备忘录模式
java·后端·spring·设计模式
苍何10 小时前
腾讯再放大招,企微 Agent 大圆开启内测
后端
ethantan11 小时前
一篇讲解AI Agent 组成:像人一样思考的智能体
人工智能·后端·程序员
Cosolar12 小时前
vLLM 生产级部署完全指南
人工智能·后端·架构
IT_陈寒13 小时前
垃圾回收器选错了,我的Java服务内存炸了
前端·人工智能·后端