SpringBoot08-Spring Boot 多环境配置

方式一:纯 Spring Profile(最常用,官方推荐)

思路:用 application-{profile}.yml 切分配置,运行时指定用哪个 profile。
如何做

src/main/resources/application.ymlapplication-dev.ymlapplication-test.ymlapplication-prod.yml

application.yml 里可以只放公共配置;每个环境放到对应文件。

如何激活(四选一即可):

  • 命令行:java -jar app.jar --spring.profiles.active=dev

  • JVM 参数:-Dspring.profiles.active=dev

  • 环境变量:SPRING_PROFILES_ACTIVE=dev

  • application.yml

    spring:profiles:active: dev
    

何时用:绝大多数项目;无需改打包流程,开发/测试/生产切换最灵活。


方式二:同一个 yml 用分段 + on-profile(Boot 2.4+)

思路:一个文件里--- 分段,并用 spring.config.activate.on-profile 指定生效条件。
如何做

# application.yml (一个文件)
server:port: 8080   # 公共---
spring:config:activate:on-profile: dev
datasource:url: jdbc:...---
spring:config:activate:on-profile: prod
datasource:url: jdbc:...

每个块里可以加一个条件:

spring:config:activate:on-profile: dev

一、单文件 + --- + spring.config.activate.on-profile 的规则

1. 公共段(最上面没有 on-profile 的部分)

  • 始终加载,不管你激活哪个 profile

  • 可以放端口号、应用名这种通用配置

2. 环境段(有 on-profile 的部分)

  • 只有当你激活对应 profile 时才加载

  • 激活方式就是 spring.profiles.active


二、激活 profile 的途径(不仅仅是运行时)

  • 运行时命令行

    java -jar app.jar --spring.profiles.active=dev
    
  • JVM 参数

    java -jar -Dspring.profiles.active=dev app.jar
    
  • 环境变量

    SPRING_PROFILES_ACTIVE=dev
    
  • application.yml 的公共部分写死

    spring:profiles:active: dev
    

何时用:不想维护多个文件时;仍是“纯 Spring”的方式。


方式三:Maven/Gradle 构建期切换(资源过滤 + 占位符)


1. 核心思想

Spring Boot 原生的 Profile 切换(方式一、二)是运行时选择环境。
而方式三是让 构建工具(Maven/Gradle)在打包的时候就决定环境,即:

👉 打包出来的 jar 已经带着某个环境的配置,运行时不用再指定。


2. 原理

  1. Maven/Gradle 的 profiles 可以给不同环境定义属性。

  2. 资源过滤(resource filtering) 会在打包时,把配置文件里的占位符替换为 Maven/Gradle 的属性值。

  3. Spring Boot 启动时读取配置文件,就已经是对应环境的内容了。


3. 步骤(以 Maven 为例)

1. 定义多环境 Profile

pom.xml 里写不同的 profile:

<profiles><!-- 开发环境 --><profile><id>dev_env</id><properties><profile.active>dev</profile.active></properties></profile><!-- 测试环境 --><profile><id>test_env</id><properties><profile.active>test</profile.active></properties></profile><!-- 生产环境 --><profile><id>prod_env</id><properties><profile.active>prod</profile.active></properties></profile>
</profiles>

2. 开启资源过滤

pom.xml<build> 里:

<build><resources><resource><directory>src/main/resources</directory><filtering>true</filtering></resource></resources>
</build>

3. 在 Spring 配置里用占位符

application.yml

spring:profiles:active: @profile.active@

这里的 @profile.active@ 会在打包时被 Maven 替换成对应 profile 的值(比如 dev)。

4. 打包时选择环境

mvn clean package -Pdev_env   # 打包时替换成 dev
mvn clean package -Ptest_env  # 打包时替换成 test
mvn clean package -Pprod_env  # 打包时替换成 prod

生成的 jar 里 application.yml 已经被替换成:

spring:profiles:active: dev

(或者 test/prod,取决于你打包时选了哪个)


4. 运行时

直接运行 jar 就行,不用再传 --spring.profiles.active

java -jar target/demo-1.0.0.jar

因为它在打包时已经确定了环境。


5. 适用场景

  • CI/CD 构建流水线里,每个环境需要一份独立的 jar(比如 demo-dev.jardemo-prod.jar)。

  • 公司要求运维简单:生产只拿固定的包运行,不允许再传启动参数。


6. 总结一句

方式三其实是“打包时定死环境,用 Maven profile 替换 yml 的占位符”。

<activation> 是否必须?不是!

  • 不写 <activation>:你需要用 -Pxxx 手动选择哪个 Maven profile。

  • 写了 <activeByDefault>true</activeByDefault>:在没传 -P 时默认用这个。

方式四:外部化配置文件(不改包,部署时挂载)

思路:jar 外面放环境配置,通过路径或目录注入。
怎么做

  • 指定额外位置:
    java -jar app.jar --spring.config.additional-location=/etc/app/
    在该目录放 application-prod.yml,配合 SPRING_PROFILES_ACTIVE=prod 使用。

  • 或直接指定完整路径:
    --spring.config.location=/etc/app/application.yml

何时用:Docker/K8s/云上部署;把“敏感/环境差异”留到部署层处理。


方式五:代码层面的 Bean 隔离(@Profile)

思路:按环境注册不同的 Bean。
怎么做

@Profile("prod")
@Configuration
public class ProdConfig { ... }@Profile("dev")
@Configuration
public class DevConfig { ... }

何时用:某些组件在不同环境需要完全不同的实现(如 Mock vs 实际服务)。


#(可选)增强:Profile 组 & 包含

  • Profile 组(Boot 2.4+):一个 profile 激活一组子 profile。

    spring:profiles:group:prod: [db, redis, messaging]
    
  • include(老版本)
    spring.profiles.include=db,redis

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

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

相关文章

苍穹外卖项目笔记day04--Redis入门

Redis 概念 Redis 是一个开源的、高性能的键值存储系统&#xff0c;常被归类为NoSQL数据库。它支持多种数据结构&#xff0c;如字符串、列表、哈希、集合和有序集合&#xff0c;适用于缓存、消息队列、实时分析等多种场景。Redis是一个基于内存的key-value结构数据库。Redis …

OpenCV 图像处理实战与命令行参数配置:从轮廓检测到模板匹配

在计算机视觉领域&#xff0c;OpenCV 是一款功能强大且应用广泛的开源库&#xff0c;它提供了丰富的 API&#xff0c;支持图像读取、预处理、特征检测等多种操作。本文将结合实际代码案例&#xff0c;详细讲解如何使用 OpenCV 实现轮廓检测、轮廓近似、模板匹配等常用功能&…

深度学习---pytorch卷积神经网络保存和使用最优模型

在深度学习模型训练过程中&#xff0c;如何提升模型性能、精准保存最优模型并实现高效推理&#xff0c;是每个开发者必须攻克的关键环节。本文结合实际项目经验与完整代码示例&#xff0c;详细拆解模型训练优化、最优模型保存与加载、图像预测全流程&#xff0c;帮助大家避开常…

FPGA实现Aurora 64B66B图像视频点对点传输,基于GTY高速收发器,提供2套工程源码和技术支持

目录 1、前言Aurora 64B66B是啥&#xff1f;官方有Example&#xff0c;为何要用你这个&#xff1f;工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目我这里已有的 GT 高速接口解决方案本方案在Aurora 8B10B上的应用 3、工程详细设…

LeetCode 524.通过删除字母匹配到字典里最长单词

给你一个字符串 s 和一个字符串数组 dictionary &#xff0c;找出并返回 dictionary 中最长的字符串&#xff0c;该字符串可以通过删除 s 中的某些字符得到。 如果答案不止一个&#xff0c;返回长度最长且字母序最小的字符串。如果答案不存在&#xff0c;则返回空字符串。 示例…

kali_linux

【2024版】最新kali linux入门及常用简单工具介绍&#xff08;非常详细&#xff09;从零基础入门到精通&#xff0c;看完这一篇就够了-CSDN博客

MyBatis 常见错误与解决方案:从坑中爬出的实战指南

&#x1f50d; MyBatis 常见错误与解决方案&#xff1a;从坑中爬出的实战指南 文章目录&#x1f50d; MyBatis 常见错误与解决方案&#xff1a;从坑中爬出的实战指南&#x1f41b; 一、N1 查询问题与性能优化&#x1f4a1; 什么是 N1 查询问题&#xff1f;⚠️ 错误示例✅ 解决…

蓝牙modem端frequency offset compensation算法描述

蓝牙Modem中一个非常关键的算法:频偏估计与补偿(Frequency Offset Estimation and Compensation)。这个算法是接收机(解调端)能正确工作的基石。 我将为您详细解释这个算法的原理、必要性以及其工作流程。 一、核心问题:为什么需要频偏补偿? 频偏的来源: 如第一张图所…

基于STM32的居家养老健康安全检测系统

若该文为原创文章&#xff0c;转载请注明原文出处。一、 项目背景与立项意义社会老龄化趋势加剧&#xff1a;全球范围内&#xff0c;人口结构正经历着前所未有的老龄化转变。中国也不例外&#xff0c;正快速步入深度老龄化社会。随之而来的是庞大的独居、空巢老年人群体的健康监…

简易TCP网络程序

目录 1. TCP 和 UDP 的基本区别 2. TCP 中的 listen、accept 和 connect 3. UDP 中的区别&#xff1a;没有 listen、accept 和 connect 4. 总结对比&#xff1a; 2.字符串回响 2.1.核心功能 2.2 代码展示 1. server.hpp 服务器头文件 2. server.cpp 服务器源文件 3. …

广电手机卡到底好不好?

中国广电于2020年与中国移动签署了战略合作协议&#xff0c;双方在5G基站建设方面实现了共建共享。直到2022年下半年&#xff0c;中国广电才正式进入号卡服务领域&#xff0c;成为新晋运营商。虽然在三年的时间内其发展速度较快&#xff0c;但对于消费者而言&#xff0c;广电的…

Git中批量恢复文件到之前提交状态

<摘要> Git中批量恢复文件到之前提交状态的核心命令是git checkout、git reset和git restore。根据文件是否已暂存&#xff08;git add&#xff09;&#xff0c;需采用不同方案&#xff1a;未暂存变更用git checkout -- <file>或git restore <file>丢弃修改&…

UniApp 基础开发第一步:HBuilderX 安装与环境配置

UniApp 是一个基于 Vue.js 的跨平台开发框架&#xff0c;支持快速构建小程序、H5、App 等应用。作为开发的第一步&#xff0c;正确安装和配置 HBuilderX&#xff08;官方推荐的 IDE&#xff09;是至关重要的。下面我将以清晰步骤引导您完成整个过程&#xff0c;确保环境可用。整…

华为云Stack Deploy安装(VMware workstation物理部署)

1.1 华为云Stack Deploy安装(VMware workstation物理部署) 步骤 1 安装软件及环境准备 HUAWEI_CLOUD_Stack_Deploy_8.1.1-X86_64.iso HCSD安装镜像 VMware workstation软件 VirtualBox安装包 步骤2 修改VMware workstation网络模式 打开VMware workstation软件,点“编辑”…

安全等保复习笔记

信息安全概述1.2 信息安全的脆弱性及常见安全攻击 • 网络环境的开放性物理层--物理攻击 • 物理设备破坏 ➢ 指攻击者直接破坏网络的各种物理设施&#xff0c;比如服务器设施&#xff0c;或者网络的传输通信设施等 ➢ 设备破坏攻击的目的主要是为了中断网络服务 • 物理设备窃…

【Audio】切换至静音或振动模式时媒体音自动置 0

一、问题描述 基于 Android 14平台&#xff0c;AudioService 中当用户切换到静音模式&#xff08;RINGER_MODE_SILENT&#xff09;或振动模式&#xff08;RINGER_MODE_VIBRATE&#xff09;时会自动将响铃和通知音量置0&#xff0c;当切换成响铃模式&#xff08;RINGER_MODE_NO…

VPS云服务器安全加固指南:从入门到精通的全面防护策略

在数字化时代&#xff0c; VPS云服务器已成为企业及个人用户的重要基础设施。随着网络攻击手段的不断升级&#xff0c;如何有效进行VPS安全加固成为每个管理员必须掌握的技能。本文将系统性地介绍从基础配置到高级防护的完整安全方案&#xff0c;帮助您构建铜墙铁壁般的云服务器…

Mysql杂志(八)

游标游标是MySQL中一种重要的数据库操作机制&#xff0c;它解决了SQL集合操作与逐行处理之间的矛盾。这个相信大家基本上都怎么使用过&#xff0c;这个都是建立在使用存储过程的基础上的。我们都知道SQL都是批量处理的也就是面向集合操作&#xff08;一次操作多行&#xff09;&…

Dify 从入门到精通(第 71/100 篇):Dify 的实时流式处理(高级篇)

Dify 从入门到精通&#xff08;第 71/100 篇&#xff09;&#xff1a;Dify 的实时流式处理 Dify 入门到精通系列文章目录 第一篇《Dify 究竟是什么&#xff1f;真能开启低代码 AI 应用开发的未来&#xff1f;》介绍了 Dify 的定位与优势第二篇《Dify 的核心组件&#xff1a;从…

日志分析与安全数据上传脚本

最近在学习计算机网络&#xff0c;想着跟python结合做一些事情。这段代码是一个自动化脚本&#xff0c;它主要有三个功能&#xff1a;分析日志&#xff1a; 它从你指定的日志文件中读取内容&#xff0c;并筛选出所有包含特定关键字的行。网络交互&#xff1a; 它将筛选出的数据…