4.9 配置文件
-
通常情况下,Spring Boot 在启动时会将resources目录下的 application.properties 或 apllication.yml 作为其默认配置文件,我们可以在该配置文件中对项目进行配置,但这并不意味着 Spring Boot 项目中只能存在一个application.properties 或 application.yml。
-
Spring Boot 项目中可以存在多个 application.properties 或 apllication.yml。
-
Spring Boot 启动时会扫描以下 5 个位置的 application.properties 或 apllication.yml 文件,并将它们作为 Spring boot 的默认配置文件。
-
properties的配置位置
file:./config/*/
file:/config/application.properties | 项目路径
file:/application.properties
classpath:/config/application.properties | src下的java或resources为类路径
classpath:/application.properties
注:file: 指当前项目根目录;classpath: 指当前项目的类路径,即 resources 目录。
以上所有位置的配置文件都会被加载,且它们优先级依次降低,序号越小优先级越高。其次,位于相同位置的 application.properties 的优先级高于 application.yml。
-
同级目录下,都是优先config下得高于外部的配置文件
-
项目下config>项目下配置文件>类路径config>类路径下配置文件
所有位置的文件都会被加载,高优先级配置会覆盖低优先级配置,形成互补配置,即:
-
存在相同的配置内容时,高优先级的内容会覆盖低优先级的内容;
-
存在不同的配置内容时,高优先级和低优先级的配置内容取并集。
-
指定那个环境配置生效
# 生产环境
server:
port: 8083
# 测试环境
server:
port: 8082
# springboot多环境配置,可以选择激活那个配置文件
spring:
profiles:
active: dev
- 也可以这样指定在一个yml中进行多环境配置,用—符号分割
#更改项目端口号
server:
port: 8081
# springboot多环境配置,可以选择激活那个配置文件
spring:
profiles:
active: dev
---
server:
port: 8082
spring:
profiles: dev
---
server:
port: 8083
spring:
profiles: test
4.10 外部配置文件
-
除了默认配置文件,Spring Boot 还可以加载一些位于项目外部的配置文件。我们可以通过如下 2 个参数,指定外部配置文件的路径:
-
- spring.config.location
- spring.config.additional-location
4.10.1 spring.config.location
- 先将 Spring Boot 项目打包成 JAR 文件,然后在命令行启动命令中,使用命令行参数 --spring.config.location,指定外部配置文件的路径。
java -jar {JAR} --spring.config.location={外部配置文件全路径}
使用该参数指定配置文件后,会使项目默认配置文件(application.properties 或 application.yml )失效,Spring Boot 将只加载指定的外部配置文件。
- 在本地目录 D:\myConfig 下,创建一个配置文件 my-application.yml,配置如下。
#指定配置文件
server:
port: 8088
- 执行以下 mvn 命令,将 springbootdemo02项目打包成 JAR。
mvn clean package
-
在项目target目录下找到打好的jar包
-
打开命令行窗口,跳转到 JAR 文件所在目录,执行以下命令,其中 --spring.config.location 用于指定配置文件的新位置。
java -jar springbootdemo02-0.0.1-SNAPSHOT.jar --spring.config.location=D:\myConfig\my-application.yml
从控制台输出可以看出:
-
服务器端口号从“8081”被修改为“8088”,表示外部配置文件已生效;
-
上下文路径则从“/abc”被修改为默认值(‘ ’),表示项目内部的默认配置文件已失效。
-
浏览器访问:http://127.0.0.1:8088/test
4.10.2 spring.config.additional-location
- 我们还可以在 Spring Boot 启动时,使用命令行参数 --spring.config.additional-location 来加载外部配置文件。
java -jar {JAR} --spring.config.additional-location={外部配置文件全路径}
但与 --spring.config.location 不同,–spring.config.additional-location 不会使项目默认的配置文件失效,使用该命令行参数添加的外部配置文件会与项目默认的配置文件共同生效,形成互补配置,且其优先级是最高的,比所有默认配置文件的优先级都高。
- 示例:将 springbootdemo02打包为 JAR 文件,打开命令行窗口,跳转到该项目 JAR 所在目录下,执行以下命令启动该项目。
java -jar springbootdemo02-0.0.1-SNAPSHOT.jar --spring.config.additional-location=D:\myConfig\my-application.yml
- 结果如下图。
注意:Maven 对项目进行打包时,位于项目根目录下的配置文件是无法被打包进项目的 JAR 包的,因此位于根目录下的默认配置文件无法在 JAR 中生效,即该项目将只加载指定的外部配置文件和项目类路径(classpath)下的默认配置文件,它们的加载优先级顺序为:
- 命令⾏参数
- Java系统属性(System.getProperties())
- 操作系统环境变量
- spring.config.additional-location 指定的jar包外部配置文件 my-application.yml
- jar包内部classpath:/config/application.yml
- classpath:/application.yml
- @Configuration注解类上的@PropertySource
优先级从⾼到低,⾼优先级的配置覆盖低优先级的配置,所有配置会形成互补配置。
- 根据配置文件优先级分析可知:
- 以上三个配置文件中 my-application.yml 的优先级最高,因此该项目的服务器端口号为 “8088”;
- 只有 classpath:/config/application.yml 中配置了上下文路径(context-path),因此该项目的上下文路径为 “/abc”;
- 基于以上配置分析,得出该项目访问路径为“http://localhost:8088/helloWorld”。
- 使用浏览器访问 http://127.0.0.1:8088/abc/test结果如下图
通过上面的示例,我们看到将 Spring Boot 项目打包后,然后在命令行启动命令中添加 spring.config.additional-location 参数指定外部配置文件,会导致项目根目录下的配置文件无法被加载,我们可以通过以下 3 种方式解决这个问题。
在 IDEA 的运行配置(Run/Debug Configuration)中,添加虚拟机参数 -Dspring.config.additional-location=D:\myConfig\my-application.yml,指定外部配置文件;
在 IDEA 的运行配置(Run/Debug Configuration)中,添加程序运行参数 --spring.config.additional-location=D:\myConfig\my-application.yml,指定外部配置文件;
在主启动类中调用 System.setProperty()方法添加系统属性 spring.config.additional-location,指定外部配置文件。