SpringBoot 多环境配置 Profile详解以及配置文件加载优先级
本文主要围绕SpringBoot中多环境配置文件进行讲解,多种properties文件、多种yml配置文件,以及当这些配置文件都存在时,加载的优先级是什么。
一、什么是 Profile 环境配置?
在项目开发过程中,我们通常会有开发环境(dev)、测试环境(test)、生产环境(prod) 三种场景:
-
开发环境:连接本地数据库、本地 Redis,调试日志全开;
-
测试环境:连接测试服务器数据库,给测试人员使用;
-
生产环境:部署在云服务器,连接线上数据库,关闭调试日志、配置线上端口。
如果每次切换环境都手动修改配置文件,很容易出错。SpringBoot 提供了Profile多环境配置机制,可以一键切换运行环境,不用反复修改配置。
二、多文件拆分式配置(推荐)
2.1 properties 格式多环境配置
2.1.1 配置文件命名规范
主配置文件:application.properties(全局公共配置 + 指定激活环境)
多环境配置文件命名规则:
application-{环境标识}.properties
常用三种环境命名:
application-dev.properties:开发环境配置
application-test.properties:测试环境配置
application-prod.properties:生产环境配置
2.1.2 文件结构示例
resources
├── application.properties # 主配置文件(公共配置+激活环境)
├── application-dev.properties # 开发环境专属配置
├── application-test.properties # 测试环境专属配置
└── application-prod.properties # 生产环境专属配置
2.1.3 3. 配置示例
这一小节我只简单进行配置文件加载优先级的演示,不做具体的配置

主配置文件和dev配置文件的设置如下:


当我们运行启动类的时候,会优先加载dev的配置文件,因为我们在主配置文件中设置了优先加载dev,所以启动启动类的时候会占用dev配置文件中所设置的8087端口

2.2 yml 格式多文件拆分配置
yml 同样支持多文件拆分,命名规则和 properties 完全一致:
resources
├── application.yml # 主配置文件
├── application-dev.yml # 开发环境
├── application-test.yml # 测试环境
└── application-prod.yml # 生产环境
2.2.1 主配置 application.yml
spring:
application:
name: springboot-demo
# 激活开发环境dev
profiles:
active: dev
2.2.2 开发环境 application-dev.yml
server:
port: 8081
因为properties的优先级高于yml,所以我们在测试yml配置文件的时候,先把properties配置文件的内容注释掉。这里运行启动类,占用的端口好为8081
三、 yml 单文件多文档块配置(单文件区分多环境)
yml 语法支持用---作为分隔符,在同一个 yml 文件中编写多个环境的配置,不需要拆分多个配置文件,适合简单小项目。
3.1 语法规则
-
第一块:全局公共配置 + 指定默认激活的环境
-
使用---分隔不同环境配置块
-
每个环境块通过spring.profiles: 环境名声明当前属于哪个环境
3.2 完整示例
#配置项目端口号,更改的是DispatcherServletAutoConfiguration里边的自动装配的默认值(8080)
server:
port: 8084
spring:
config:
activate:
on-profile: dev
---
server:
port: 8085
spring:
config:
activate:
on-profile: dev2
---
server:
port: 8086
spring:
config:
activate:
on-profile: dev3
我们这里配置了三个yml配置文件,“---”作为分隔符。
有了这些配置当我们启动项目的时候,会走默认路径8080

那么我们如何选择自己所需要的配置文件呢?
点击右上角编辑配置

我们需要在虚拟参数后面设置自己所需要的配置文件
-Dspring.profiles.active=dev

这里我以dev配置文件演示,启动tomcat,端口号为8084

当我将虚拟机参数改为dev2时,启动启动类,那么端口号就会变为8085


四、四种激活指定 Profile 环境的方式
方式 1:配置文件中直接指定(最常用)
在主配置文件添加配置,项目默认使用该环境启动:
# properties
spring.profiles.active=dev
# yml
spring:
profiles:
active: dev
方式 2:Jar 包部署时,命令行参数指定(线上部署常用)
云服务器通过 java -jar 启动项目时,在命令行末尾指定激活环境,优先级高于配置文件:
java -jar demo-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod
方式 3:IDEA 测试运行时,配置程序命令行参数
在 IDEA 启动配置中,Program arguments位置填入:
--spring.profiles.active=dev,仅当前测试启动生效。
方式 4:JVM 虚拟机参数指定
-
IDEA 启动 JVM 参数:-Dspring.profiles.active=dev
-
Jar 启动时 JVM 参数方式:
java -Dspring.profiles.active=prod -jar demo.jar
优先级小结
虚拟机参数 > 命令行参数 > 配置文件内指定
五、SpringBoot 配置文件四大加载位置与优先级
SpringBoot 启动时,会自动扫描以下 4 个位置的application.properties/application.yml配置文件,优先级从高到低依次排列,高优先级配置会覆盖低优先级的同名配置,所有位置的配置会互补加载。
加载优先级(由高→低)
-
file:./config/:项目当前根目录下的 config 文件夹(最高优先级)
-
file:./:项目根目录下
-
classpath:/config/:resources 资源目录下的 config 文件夹
-
classpath:/:resources 资源根目录(最低优先级)
核心特点
-
四个位置的配置文件全部都会被加载;
-
相同 key 的配置,高优先级配置覆盖低优先级;
-
不同 key 的配置全部互补生效,不会丢失。
补充:项目访问根路径配置
在 classpath 下的主配置文件中可以配置项目访问上下文路径:
server.servlet.context-path=/boot3
配置后,项目访问地址需要带上路径:http://IP:端口/boot3/xxx
六、两种多环境配置方式对比
| 配置方式 | 适用文件类型 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 多文件拆分配置 | properties、yml 都支持 | 结构清晰,不同环境配置解耦,便于维护 | 配置文件数量较多 | 企业级正式项目、多环境复杂场景 |
| 单文件多文档块 | 仅 yml 支持 | 配置集中在一个文件,简单方便 | 配置耦合,环境多了文件臃肿 | 小型测试项目、快速本地调试 |

浙公网安备 33010602011771号