Spring spring

Spring中文网站 > Spring Boot > Spring Boot怎么配置主类 Spring Boot如何引入静态资源
Spring Boot怎么配置主类 Spring Boot如何引入静态资源
发布时间:2026/09/20 16:40:57

品牌型号:联想ThinkPad X1

系统:Windows10家庭版

软件版本:Spring 5.3.7

发现有很多开发者在跑Spring Boot项目时都是IDE点一下运行按钮,至于main方法的主类到底该放哪儿、能不能随便挪位置,基本都没太深究过,等有一天项目结构调整了,主类挪了个位置扫描不到Bean了,才回头查这个问题。同样的,前端资源文件放哪儿、怎么才能被访问到,也是我们新手常踩的坑,明明资源文件放进去了,访问却是404。看这两个问题好像不搭边,但都属于“能跑起来但没弄明白为什么”的问题,下面给大家介绍一下Spring Boot怎么配置主类,Spring Boot如何引入静态资源的相关内容。

一、Spring Boot怎么配置主类

严格说起来主类没什么要配置的,简单来说就是一个带main方法的类,上面加个@SpringBootApplication注解,里面调一句SpringApplication.run就可以了。我们来说说这个@SpringBootApplication注解,它本身是个组合注解,我们点进源码能看到,实际上是@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan这三个注解叠加的结果。

主类
图1:主类

@SpringBootConfiguration本质就是@Configuration,说明主类自己也是个配置类,@EnableAutoConfiguration负责开启自动配置,是Spring Boot“开箱即用”的核心机制,而@ComponentScan则负责扫描包路径下带注解的类,注册成Bean。

@SpringBootConfiguration注解源码
图2:@SpringBootConfiguration注解源码

为什么很多教程都强调主类要放在项目的根包下面呢?如果我们不手动指定basePackages,它默认只扫描主类所在包及其子包,要是主类放的位置太深,或者跟其他业务代码不在同一个包树下,那些没被扫描到的类自然也就没法注册成Bean,运行时就会报找不到Bean的错误。

主类放在根包下
图3:主类放在根包下

如果工作中因为项目结构原因,没法把主类放在根包下,也不是没办法,我们可以在@ComponentScan里显式指定basePackages参数,把需要扫描的包路径列出来,或者用@Import手动导入某些配置类,绕开自动扫描的限制。

二、Spring Boot如何引入静态资源

在Spring Boot中,对静态资源引入其实是有默认约定的,默认情况下,它会去几个固定目录下找静态文件,我们把图片、CSS、JS这些文件扔进去,项目启动后直接用根路径访问就行,比如static/img/logo.png,浏览器访问http://localhost:8080/img/logo.png就能拿到,注意static这一层是不需要出现在访问路径里的。

在浏览器中访问静态资源
图4:在浏览器中访问静态资源

有开发者好奇为什么static这一层不需要出现在访问路径里,其实是WebMvcAutoConfiguration在起作用,它默认配置了一个ResourceHttpRequestHandler,把/**这个路径映射到上面那几个目录。如果几个目录同时存在同名文件,按前面列的顺序,static目录的优先级最高。

WebMvcAutoConfiguration源码
图5:WebMvcAutoConfiguration源码

如果默认目录不满足需求,想自定义静态资源路径,我们可以在application.properties或者application.yml里配置spring.web.resources.static-locations并指定一个或多个自定义目录,这里要注意下,一旦我们手动配置了这个属性,Spring Boot默认的那几个目录就会被覆盖掉。

自定义目录
图6:自定义目录

有一种更灵活的方式,我们可以写一个类实现WebMvcConfigurer,重写addResourceHandlers方法,手动指定资源路径和访问路径的映射关系,这种方式适合资源文件不在classpath下,而是在磁盘某个外部目录的场景,例如需要对外访问用户上传至磁盘的文件时,这时候就需要用addResourceLocations指向文件系统的实际路径,而不是classpath。

以上就是Spring Boot怎么配置主类,Spring Boot如何引入静态资源的全部内容了。说到底这两个问题都是“约定优于配置”的具体体现,主类位置决定了@ComponentScan能扫到哪些类,静态资源目录决定了哪些文件能被直接访问到,平时开发运行没出问题是因为项目结构刚好落在默认约定里。

 

180 1563 6924