SpringBoot配置文件、静态资源不同文件目录加载优先级

SpringBoot配置文件、静态资源不同文件目录加载优先级

一、Spring Boot 配置文件扫描优先级

1、Spring Boot 启动会扫描以下位置的 application.properties 或者 application.yml/yaml 文件作为 Spring Boot 的默认配置文件**

(1)当前项目下的 config 文件夹中;
(2)当前项目路径的根目录下;
(3)resource资源文件下的 config 文件夹中;
(4)resource资源文件下(项目默认创建的配置文件)。

启动 Spring Boot 项目扫描这四个位置的配置文件的顺序优先级为:

优先级 1:当前项目下的 config文件夹中的配置文件
优先级 2:当前项目路径的根目录的配置文件
优先级 3:resource资源文件下的 config 文件夹中的配置文件
优先级 4:resource资源路径下的配置文件(默认创建的配置文件)

官方文档说明:

  也就是假如说当前项目下的 config 文件夹目录中有 application.yaml/yml 或者 application.properties 就直接扫描到并加载这个配置文件了,优先级由高到底,高优先级的配置会覆盖低优先级的配置。

那么就这样写死了吗 ?就不可以改变这个优先级顺序了吗 ?

   像 SpringBoot 这么优秀的框架,肯定是可以自定义的。我们可以指定位置加载配置文件,可以通过  `spring.config.location`  来改变默认的配置文件位置。项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置;这种情况,一般是后期运维做的多,相同配置,外部指定的配置文件优先级最高。
java -jar spring-boot-config.jar --spring.config.location=D:springboot/application.properties

2、再说一点就是在不同的环境会使用不同的配置文件

profile 是 Spring 对不同环境提供不同配置功能的支持,可以通过激活不同的环境版本,实现快速切换环境。比如说:

表示开发环境配置:application-dev.properties
表示测试环境配置:application-test.properties

注意:配置文件的命名,只要前缀是 application 开头即可。Spring Boot 并不会直接启动这些配置文件,在不指定配置文件时,它默认使用 application.properties/yaml/yml 主配置文件。我们需要通过一个配置来选择需要激活的环境。
通过 active 属性来指定通过哪一个配置文件来启动项目。

方式一:通过 properties 配置文件

创建几个 properties 文件来完成

方式二:通过 yaml 配置文件

创建一个 yaml 文件即可完成,用三个横线来表示不同的 yaml 文件的配置

二、静态资源扫描优先级

1 、静态资源放在 resources 资源文件目录里,一共有四个目录可以放静态资源文件:

(1) webjars 访问路径:localhost:8080/webjars/ 很少使用这个

(2) resources、static(默认创建)、public 访问路径:localhost:8080/

在这里插入图片描述
当然也可以放到 resources 资源文件的根目录下,它扫描就是通过 /** 扫描。

你还会看到 templates目录 ,templates目录下的模版资源,以前版本是要通过 Controller 来跳转访问,像 Spring 项目的 webapp 下的 WEB-INF目录。但是最新版本(比如2.4.0以后)外部是可以直接访问到 template 目录的资源的,而且可以 通过 localhost:8080 直接跳转到 index 开头的资源作为首页展示 ,这些操作在之前是要进行首页扩展才可以做到的,最新版就全部帮你做了。具体从哪一个spring boot 版本开始有的,我没有验证,但是 2.4.0以后是可以的。你要还是没有明白的话,直接看之前版本的操作逻辑:

2、其中加载的优先级:

resources目录 > static目录 > public目录

  • Resourceproperties.class 源码:
public class ResourceProperties {
    private static final String[] CLASSPATH_RESOURCE_LOCATIONS = new String[]
    {"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/","classpath:/public/"};
    private String[] staticLocations;
    private boolean addMappings;
    ...
}
  • WebMvcAutoConfiguration.class 源码:
public void addResourceHandlers(ResourceHandlerRegistry registry) {
            if (!this.resourceProperties.isAddMappings()) {
                logger.debug("Default resource handling disabled");
            } else {
                Duration cachePeriod = this.resourceProperties.getCache().getPeriod();
                CacheControl cacheControl = this.resourceProperties.getCache().getCachecontrol().toHttpCacheControl();
                if (!registry.hasMappingForPattern("/webjars/**")) {
                    this.customizeResourceHandlerRegistration(registry.addResourceHandler(new String[]{"/webjars/**"})
                    .addResourceLocations(new String[]{"classpath:/META-INF/resources/webjars/"})
                    .setCachePeriod(this.getSeconds(cachePeriod)).setCacheControl(cacheControl));
                }

                String staticPathPattern = this.mvcProperties.getStaticPathPattern();
                if (!registry.hasMappingForPattern(staticPathPattern)) {
                    this.customizeResourceHandlerRegistration(registry.addResourceHandler(
                    new String[]{staticPathPattern}).addResourceLocations(WebMvcAutoConfiguration.getResourceLocations
                    (this.resourceProperties.getStaticLocations())).setCachePeriod(this.getSeconds(cachePeriod))
                    .setCacheControl(cacheControl));
                }
           }
       }

这些东西源码或者官方文档里面都是可以找到的,大家都要学会有一种自己去文档和源码里找答案的习惯哦!

附 Spring Boot 官方参考文档地址:https://docs.spring.io/spring-boot/docs/2.4.0-M3


原文:https://blog.csdn.net/qq_43012792/article/details/108689752
作者: 一个长不胖的程序YUAN