springboot的热部署和静态资源映射规则

springboot

springboot热部署

Spring Boot 内置 spring-boot-devtools 开发工具模块,专门为开发者提供热部署支持,修改项目代码、配置文件或静态资源后,无需手动重启应用即可自动生效,仅对修改的项目代码快速重启,避免全量加载依赖,大幅缩短重复重启的等待时间,显著提升开发迭代效率。

引入依赖

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 来实施热部署

springboot静态资源的核心映射规则

SpringBoot 对静态资源(JS、CSS、图片等)的访问提供了自动配置支持,核心依赖 WebMvcAutoConfiguration 自动配置类。其底层通过重写 addResourceHandlers 方法,借助 ResourceHandlerRegistry(资源处理器注册器)注册多个 ResourceHandler(资源处理器),分别定义了普通静态资源和 WebJars 资源的存放路径与 URL 访问路径映射关系;同时遵循 Controller 映射优先级高于静态资源映射的规则,确保请求匹配的合理性。

首先我们找到 spring-boot-autoconfigure 的jar包,点击 spring.factories 文件,找到 org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,

进入 WebMvcAutoConfiguration 核心配置类

SpringBoot 之所以能访问到静态资源,本质是 WebMvcAutoConfiguration 自动配置类中,通过 addResourceHandlers 方法注册了默认的资源处理器

下面具体简述该函数代码

第一部分:加载缓存配置

点击进入 ResourceProperties

这是静态资源相关配置的绑定类,可以在 application.yml/properties 静态资源配置中进行设置和静态资源有关的参数,包括缓存时间等

第二部分:注册 WebJars 专用资源处理器

Webjars 是以 jar 包的方式引入静态资源,Webjars 的网址为 https://www.webjars.org/

由代码可知所有以 /webjars/ 开头的请求都会被该处理器处理,WebJars 组件的 Jar 包中静态资源默认存放在 classpath:META-INF/resources/webjars/ 目录下

下面以引入 jQuery 为例进行演示

使用方式是导入 org.webjars 的相关依赖

xml 复制代码
        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>jquery</artifactId>
            <version>3.3.1</version>
        </dependency>

访问方式是访问 classpath:META-INF/resources/webjars/ 目录下的内容,例如访问 jquery 的路径为:localhost:8080/webjars/jquery/3.3.1/jquery.js

第三部分是:注册普通静态资源处理器

点击 getStaticPathPattern 函数进入 WebMvcProperties 类中,里面 staticPathPattern 注册 URL 访问路径模式,默认是 /**(所有未被 Controller 处理的请求),可通过配置修改

点击 getStaticLocations 函数进入 ResourceProperties 类中,里面 staticLocations 读取默认 / 自定义的静态资源目录,默认值为四个目录

优先级从高到低(同名文件会优先访问优先级高的目录):

静态资源 classpath:/META-INF/resources/,即项目内实际存放路径 src/main/resources/META-INF/resources/

静态资源 classpath:/resources/,即项目内实际存放路径 src/main/resources/resources/

静态资源 classpath:/static/,即项目内实际存放路径 src/main/resources/static/

静态资源 classpath:/public/,即项目内实际存放路径 src/main/resources/public/

下面我们来看在 WebMvcAutoConfiguration 自动配置类中 SpringBoot 的默认欢迎页的自动配置核心

welcomePageHandlerMapping 函数专门处理欢迎页的 HandlerMapping

getWelcomePage() 函数用于查找静态资源目录和模板目录下的 index.html,严格遵循静态资源默认目录优先级进行查找,只要其中任意一个目录下有 index.html,就返回该资源路径。

另外,如果通过 spring.web.resources.staticLocations 自定义了静态资源目录,getWelcomePage() 也会在自定义目录中查找 index.html

由代码可知这个方法的本质是向 SpringMVC 容器注册一个 WelcomePageHandlerMapping 实例,它是一个请求处理器映射器(HandlerMapping),专门处理根路径(/)请求,自动查找并返回项目中的 index.html 作为欢迎页。

访问 http://localhost:8080/ 自动打开欢迎页的效果

相关推荐
YDS82911 分钟前
黑马点评 —— 分布式锁详解加源码剖析
java·spring boot·redis·分布式
KD31 分钟前
阿里云服务迁移实战(二)——网关迁移与前后端分离配置
后端
迷藏49432 分钟前
**发散创新:基于 Rust的开源权限管理系统设计与实战**在现代软件架构中,**权限控制**早已不
java·开发语言·rust·开源
升鲜宝供应链及收银系统源代码服务1 小时前
《IntelliJ + Claude Code + Gemini + ChatGPT 实战配置手册升鲜宝》
java·前端·数据库·chatgpt·供应链系统·生鲜配送
daidaidaiyu1 小时前
Nacos实例一则及其源码环境搭建
java·spring
小江的记录本1 小时前
【Redis】Redis全方位知识体系(附《Redis常用命令速查表(完整版)》)
java·数据库·redis·后端·python·spring·缓存
摇滚侠1 小时前
Java 项目《谷粒商城-1》架构师级Java 项目实战,对标阿里 P6-P7,全网最强,实操版本
java·开发语言
颜酱1 小时前
回溯算法实战练习(3)
javascript·后端·算法
zihao_tom2 小时前
Spring Boot(快速上手)
java·spring boot·后端
Bear on Toilet2 小时前
基于Deepseek(C++)的SSE协议流式响应实现方案
chrome·后端·deepseek接入