在实际项目开发中,不同环境往往有不同的配置需求:

  • 开发环境(dev):本地调试,连接测试数据库;
  • 测试环境(test):接口联调,接近真实场景;
  • 生产环境(prod):性能稳定,关闭调试信息。

一、什么是多环境配置?

Spring Boot 支持通过 application-{profile}.yml 来定义多个环境下的配置文件,然后通过激活不同的 profile,切换当前应用使用的配置。

常见环境划分

环境用途
dev本地开发环境
test联调/测试环境
prod正式上线环境
uat用户验收环境(可选)

二、多环境配置的结构设计

推荐采用如下结构组织配置文件:

src/  
└── main/  
└── resources/  
├── application.yml  
├── application-dev.yml  
├── application-test.yml  
└── application-prod.yml

各文件职责

  • application.yml通用配置,所有环境共享;
  • application-dev.yml:开发环境特有配置;
  • application-test.yml:测试环境配置;
  • application-prod.yml:生产环境配置;

三、如何激活环境配置

方式一:在 application.yml 中设置

spring:  profiles:  active: dev

方式二:命令行参数指定(常用于部署)

java -jar app.jar --spring.profiles.active=prod

方式三:IDE 配置 VM 参数

在运行配置中添加:

-Dspring.profiles.active=dev

四、配置继承与覆盖逻辑

Spring Boot 启动时的配置加载顺序为:

  1. application.yml(通用配置);
  2. application-{profile}.yml(根据激活 profile 加载);
  3. 命令行参数 > 环境变量 > profile 文件内容

✅ profile 文件会覆盖主配置文件中的同名字段。

五、实战示例:开发 vs 测试 vs 生产配置对比

1. application.yml(通用配置)

spring:  application:  name: my-app  datasource:  driver-class-name: com.mysql.cj.jdbc.Driver

2. application-dev.yml

spring:  datasource:  url: jdbc:mysql://localhost:3306/dev_db  username: dev_user  password: 123456  thymeleaf:  cache: false  # 开发时关闭缓存

3. application-test.yml

spring:  datasource:  url: jdbc:mysql://localhost:3306/test_db  username: test_user  password: 654321

4. application-prod.yml

spring:  datasource:  url: jdbc:mysql://192.168.1.100:3306/prod_db  username: prod_user  password: prod_password  thymeleaf:  cache: true  logging:  level:  root: info

六、环境切换中的常见问题与解决方案

问题一:配置未生效?

排查点:

  • spring.profiles.active 是否配置正确;
  • 环境配置文件是否命名准确(如 application-dev.yml);
  • 是否被其它配置(命令行/环境变量)覆盖。

问题二:IDE 启动环境总是 default

在 IDEA 中运行时,如果没有配置 VM 参数或 YAML 设置,默认使用的是 application.yml,不包含子 profile。

-Dspring.profiles.active=dev

问题三:打包部署时 profile 无法切换?

当你将应用打成 jar 包后上传服务器,建议通过 命令行方式 激活 profile:

java -jar app.jar --spring.profiles.active=prod

或者写入 application.properties 覆盖默认激活配置:

spring.profiles.active=prod

问题四:不想分太多文件,可以使用 profile 分段写法

Spring Boot 支持使用 YAML 中的 --- 语法来在一个文件中定义多个 profile:

spring:  application:  name: my-app  ---  
spring:  config:  activate:  on-profile: dev  datasource:  url: jdbc:mysql://localhost:3306/dev_db  ---  
spring:  config:  activate:  on-profile: prod  datasource:  url: jdbc:mysql://localhost:3306/prod_db

七、进阶技巧:结合 @Profile 注解使用

在代码中我们可以通过 @Profile 注解控制 Bean 的加载:

@Configuration  
@Profile("dev")  
public class DevDataSourceConfig {  // dev 环境下的数据源配置  
}
@Configuration  
@Profile("prod")  
public class ProdDataSourceConfig {  // prod 环境下的数据源配置  
}

⚠️ 注意:未被激活的 profile 中的 Bean 不会被加载。

八、部署建议与最佳实践

建议说明
拆分配置文件每个环境单独管理,清晰明确
生产配置不要上传代码仓库密码信息敏感,建议放置服务器本地配置
使用命令行指定 profile灵活、避免被代码覆盖
开发阶段关闭缓存便于调试,如 Thymeleaf
生产阶段提高日志等级避免输出大量调试信息

九、总结

  • Spring Boot 提供了强大灵活的多环境配置能力;
  • 推荐使用 application-{profile}.yml 结构划分配置;
  • 激活方式可通过 application.yml、命令行参数、VM 参数等;
  • 结合 @Profile 注解可实现 Bean 的按需加载;
  • 合理配置有助于保障开发、测试和生产环境各自的稳定性和安全性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/917294.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/917294.shtml
英文地址,请注明出处:http://en.pswp.cn/news/917294.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

延凡智慧医院数字孪生平台

延凡智慧医院数字孪生平台是延凡科技依托物联网、数字孪生、AI 算法及边缘计算技术打造的医疗场景全要素数字化解决方案,通过构建医院物理实体与虚拟空间的实时映射,实现医疗资源优化、运营效率提升及患者体验升级。一、平台价值(一&#xff…

谈谈WebAssembly、PWA、Web Workers的作用和场景

WebAssembly、PWA 和 Web Workers 是现代 Web 开发中提升性能、扩展能力的重要技术,各自解决不同场景的问题,以下结合实际使用经验分析:一、WebAssembly(Wasm):高性能代码执行作用:WebAssembly …

嵌入式第十八课!!数据结构篇入门及单向链表

在前几章对C语言的学习中,我们学到了:基本的C语法和简单算法面向过程的编程思想而在数据结构这一篇章,我们将要学习:常用的数据存储结构算法面向对象的编程思想数据结构在正式开始学习之前,我们先来了解一下什么是数据…

win10任务栏出问题了,原来是wincompressbar导致的

问题描述兄弟们客户说自己电脑现在有问题了,任务栏显示的都不对,和之前的都不一样,现在使用起来非常难受,我们来看一下,这到底是什么问题吧!到客户现场,查看发现,客户桌面系统最底下…

FFmpegHandler 功能解析,C语言程序化设计与C++面向对象设计的核心差异

FFmpegHandler 功能解析 本文件记录了关于 FFmpegHandler 类中核心函数工作流程的详细解释。Q: FFmpeg逐帧解码,FFmpegHandler::openVideo 和 FFmpegHandler::readAVFrame 这两个函数都分别做了什么? A: 可以把整个过程想象成“准备播放一部电影”&#…

Codeforces Round 1039 (Div. 2) A-C

A. Recycling Center题目大意 给你n个垃圾袋,每个垃圾袋有一个重量 在每秒钟,你可以选择一个垃圾袋,如果他的重量小于等于c,那么你可以不花费硬币丢掉它 当你丢掉一个垃圾袋后,其他垃圾袋在这一秒重量会翻倍 问最少花费…

【设计模式】 原则

单一职责原则 对于一个类而言,有且仅有一个引起他变化的原因或者说,一个类只负责一个职责 如果一个类承担的职责过多,那么这些职责放在一起耦合度太高了,一个职责的变化可能会影响这个类其他职责的能力。 所以我们在做软件设计的时…

windows11右键菜单新增项增加drawio文件,使用draw.io

目录1.新建空白模板2.建立注册表文件1.新建空白模板 这里我们的模板文件路径为 D:\Software\drawio\template.drawio 2.建立注册表文件 首先新建一个.txt文件,我这里取名为menulize.txt,然后将下面的内容复制到.txt文件中 Windows Registry Editor Ver…

解锁网页魔法:零基础HTML通关秘籍

文章目录**解锁网页魔法:零基础HTML通关秘籍**HTML 基础目标HTML 结构认识 HTML 标签HTML 文件基本结构标签层次结构快速生成代码框架HTML 常见标签注释标签注释的原则标题标签: h1-h6段落标签: p换行标签:br综合案例: 展示博客超链接标签: a表格标签**基…

类似 Pixso 但更侧重「网页 / 软件界面设计」「前后端可视化开发」的工具

从 GoView 的 Demo 功能来看,它主要聚焦于数据可视化大屏的低代码搭建,更侧重数据图表配置和页面布局,没有类似 Pixso 的在线 UI 设计(如矢量绘图、组件样式精细化设计)功能,其核心是通过预设组件快速构建数…

MySQL--组从复制的详解及功能演练

2.MySQL的组从复制 2.1 配置mastesr [rootmysqlaa ~]# vim /etc/my.cnf [mysqld] server-id10 datadir/data/mysql socket/data/mysql/mysql.sock default_authentication_pluginmysql_native_password log-binmysql-bin[rootmysqlaa ~]# /etc/init.d/mysqld restart# 进入数据…

JavaScript将String转为base64 笔记250802

JavaScript将String转为base64 笔记250802 在 JavaScript 中将字符串转换为 Base64 编码有多种方法,每种方法都有其适用场景。下面我将全面介绍这些方法,包括处理 ASCII 字符、Unicode 字符以及性能优化方案。 基础方法:btoa() 基本用法&a…

Unity3D数学第四篇:射线与碰撞检测(交互基础篇)

Unity3D数学第一篇:向量与点、线、面(基础篇) Unity3D数学第二篇:旋转与欧拉角、四元数(核心变换篇) Unity3D数学第三篇:坐标系与变换矩阵(空间转换篇) Unity3D数学第…

数据处理和统计分析——09 数据分组

1 聚合 1.1 简介 在SQL中我们经常使用GROUP BY将某个字段,按不同的取值进行分组,在Pandas中也有groupby()函数;分组之后,每组都会有至少1条数据,将这些数据进一步处理返回单个值的过程就是聚合,比如分组之后…

【数据结构与算法】数据结构初阶:排序内容加餐(一)——快速排序:三路划分、自省排序

🔥个人主页:艾莉丝努力练剑 ❄专栏传送门:《C语言》、《数据结构与算法》、C语言刷题12天IO强训、LeetCode代码强化刷题 🍉学习方向:C/C方向 ⭐️人生格言:为天地立心,为生民立命,为…

MySqL(加餐)

范式第一范式数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,对象等非原子数据。在关系型数据库的设计中,满足第一范式是对关系模式的基本要求。不满足第一范式的数据库就不能被称为关系数据库。第一范式实际上只要…

【redis】基于工业界技术分享的内容总结

Redis 实践指南与核心概念 一、Java 中常用的 Redis 使用场景与实践 缓存(Caching) 场景:热点数据、频繁访问的数据,如商品详情、用户信息。通过缓存减少数据库压力,提高系统响应速度。 工业界实践: 淘宝…

服务端之nestJS常用异常类及封装自定义响应模块

MENU前言常用异常类(由nestjs/common提供)示例自定义异常(可选)自定义响应模块前言 在NestJS中,nestjs/common提供了大量的内置异常类,主要用于在控制器、服务等层抛出特定的HTTP错误响应。 常用异常类&…

数据链路层、NAT、代理服务、内网穿透

目录 一. 以太网 以太网帧格式 二. MAC地址 三. MTU 四. ARP协议 五. NAT NAPT 六. 代理服务器 正向代理 反向代理 七. 内网穿透 八. 内网打洞 一. 以太网 • "以太网" 不是一种具体的网络, 而是一种技术标准; 既包含了数据链路层的内 容, 也包含了一些物理层…

Rust在CentOS 6上的移植

Rust已不支持Cent OS 6 rhel是Redhat 发布的Red Hat Enterprise Linux的简称,使用rhel源代码编译的CentOS,最新的版本是CentOS 7,于2024年停止支持。而更古老的CentOS 6,则在2020年就已经结束了。 而面对如此老旧的系统&#xf…