spring boot : spring.profiles.active来解决多个profile的问题

多环境配置-SpringBoot 2.7.2 实战基础 在一个项目的开发过程中,通常伴随着多套环境:本地环境 local、开发环境 dev、集成测试环境 test、用户接受测试环境 uat、预生产环境 pre、生产环境 prod。本节的内容有些脱离真实企业开发,因为在真实的企业开发中,不会只开发一个独立的服务,而是多个微服务。发展至今,云原生也越来越普遍。面对多套环境,通常是”一套代码 + 配置中心“的方式,将代码编译打包后,在启动服务时或服务运行过程中,从配置中心读取配置,保证各个环境代码完全一致,仅配置不同。关于配置中心,在后面的系列文章中会详细介绍。... 阅读详情
AI摘要

本文介绍Spring Boot中如何使用spring.profiles.active进行环境配置切换,包括配置文件的放置位置、命令行参数设置、多环境配置及高级应用示例。

spring boot 入门 使用spring.profiles.active来分区配置

很多时候,我们项目在开发环境和生成环境的环境配置是不一样的,例如,数据库配置,在开发的时候,我们一般用测试数据库,而在生产环境的时候,我们是用正式的数据,这时候,我们可以利用profile在不同的环境下配置用不同的配置文件或者不同的配置

spring boot允许你通过命名约定按照一定的格式(application-{profile}.properties)来定义多个配置文件,然后通过在application.properyies通过spring.profiles.active来具体激活一个或者多个配置文件,如果没有没有指定任何profile的配置文件的话,spring boot默认会启动application-default.properties。

profile的配置文件可以按照application.properyies的放置位置一样,放于以下四个位置,

  1. 当前目录的 “/config”的子目录下
  2. 当前目录下
  3. classpath根目录的“/config”包下
  4. classpath的根目录下

在这里我们就定义俩个profile文件,application-cus1.properties和application-cus2.properties,

并在俩个文件中都分别写上变量cusvar=cus1和cusvar=cus2
我们在application.properyies也写上,并把profile切换到application-cus1.properties的配置文件

cusvar=cus3
spring.profiles.active=cus1
 可以通过这样子来测试 
@RestController
@RequestMapping("/task")
public class TaskController {
    @RequestMapping(value = {"/",""})
    public String hellTask(@Value("${cusvar}")String cusvar ){
        return "hello task !! myage is " + cusvar;
    }
}
在这里可以看到spring.profiles.active激活的profile不同,打印出来的结果也不一样。

除了可以用profile的配置文件来分区配置我们的环境变量,在代码里,我们还可以直接用@Profile注解来进行配置,例如数据库配置,这里我们先定义一个接口

 public interface DBConnector {
    public void configure();    
}
分别定义俩个实现类来实现它 
/**
  * 测试数据库
  */
@Component
@Profile("testdb")
public class TestDBConnector implements DBConnector {
    @Override
    public void configure() {
        System.out.println("testdb");
    }
}

/**
 * 生产数据库
 */
@Component
@Profile("devdb")
public class DevDBConnector implements DBConnector {
    @Override
    public void configure() {
        System.out.println("devdb");
    }
}
通过在配置文件激活具体使用哪个实现类 

spring.profiles.active=testdb

然后就可以这么用了

@RestController
@RequestMapping("/task")
public class TaskController {
    @Autowired DBConnector connector ;
    @RequestMapping(value = {"/",""})
    public String hellTask(){
        connector.configure(); //最终打印testdb     
        return "hello task !! myage is " + myage;
    }

}

除了spring.profiles.active来激活一个或者多个profile之外,还可以用spring.profiles.include来叠加profile


spring.profiles: testdb
spring.profiles.include: proddb,prodmq

以上就是spring boot用profile的作用

通过命令行设置属性值

相信使用过一段时间Spring Boot的用户,一定知道这条命令:java -jar xxx.jar --server.port=8888,通过使用--server.port属性来设置xxx.jar应用的端口为8888。

在命令行运行时,连续的两个减号--就是对application.properties中的属性值进行赋值的标识。所以,

java -jar xxx.jar --server.port=8888命令,等价于我们在application.properties中添加属性server.port=8888,该设置在样例工程中可见,读者可通过删除该值或使用命令行来设置该值来验证。

通过命令行来修改属性值固然提供了不错的便利性,但是通过命令行就能更改应用运行的参数,那岂不是很不安全?是的,所以Spring Boot也贴心的提供了屏蔽命令行访问属性的设置,只需要这句设置就能屏蔽:SpringApplication.setAddCommandLineProperties(false)。

多环境配置

    以上都不是重点,这才是重点,这才是重点,这才是重点,重要的事情说3遍。我们在开发Spring Boot应用时,通常同一套程序会被应用和安装到几个不同的环境,比如:开发、测试、生产等。其中每个环境的数据库地址、服务器端口等等配置都会不同,如果在为不同环境打包时都要频繁修改配置文件的话,那必将是个非常繁琐且容易发生错误的事。
    对于多环境的配置,各种项目构建工具或是框架的基本思路是一致的,通过配置多份不同环境的配置文件,再通过打包命令指定需要打包的内容之后进行区分打包,Spring Boot也不例外,或者说更加简单。
       在Spring Boot中多环境配置文件名需要满足application-{profile}.properties的格式,其中{profile}对应你的环境标识,比如:
   application-dev.properties:开发环境
   application-test.properties:测试环境
   application-prod.properties:生产环境
       至于哪个具体的配置文件会被加载,需要在application.properties文件中通过spring.profiles.active属性来设置,其值对应{profile}值。
如:spring.profiles.active=test就会加载application-test.properties配置文件内容
下面,以不同环境配置不同的服务端口为例,进行样例实验。
 
     针对各环境新建不同的配置文件application-dev.properties、application-test.properties、application-prod.properties
     在这三个文件均都设置不同的server.port属性,如:dev环境设置为8080,test环境设置为9090,prod环境设置为80
     application.properties中设置spring.profiles.active=dev,就是说默认以dev环境设置
 
测试不同配置的加载:
     执行java -jar xxx.jar,可以观察到服务端口被设置为8080,也就是默认的开发环境(dev)
 
     执行java -jar xxx.jar --spring.profiles.active=test,可以观察到服务端口被设置为9090,也就是测试环境的配置(test)
 
     执行java -jar xxx.jar --spring.profiles.active=prod,可以观察到服务端口被设置为80,也就是生产环境的配置(prod)
 
按照上面的实验,可以如下总结多环境的配置思路:
   application.properties中配置通用内容,并设置spring.profiles.active=dev,以开发环境为默认配置
   application-{profile}.properties中配置各个环境不同的内容
通过命令行方式去激活不同环境的配置。

多环境高级应用
       在某些情况下,应用的某些业务逻辑可能需要有不同的实现。例如邮件服务,假设EmailService中包含的send(String email)方法向指定地址发送电子邮件,但是我们仅仅希望在生产环境中才执行真正发送邮件的代码,而开发环境里则不发送以免向用户发送无意义的垃圾邮件。
       我们可以借助Spring的注解@Profile实现这样的功能,这样需要定义两个实现EmailService借口的类:

/**
 * 发送邮件接口.
 */
public interface EmailService {
    /**发送邮件*/
    publicvoid send();
}
发送邮件的具体实现(dev-开发环境的代码):
@Service
@Profile("dev") //开发环境的时候.
public class DevEmailServiceImpl implements EmailService{
 
    @Override
    publicvoid send() {
       System.out.println("DevEmailServiceImpl.send().开发环境不执行邮件的发送.");
    }
}


发送邮件的具体实现(prod-生产环境的代码):

@Service
@Profile("prod") //生产环境.
public class ProdEmailServiceImpl2 implements EmailService{
   
    @Override
    publicvoid send() {
       System.out.println("DevEmailServiceImpl.send().生产环境执行邮件的发送.");
       //具体的邮件发送代码.
       //mail.send();
    }
}
@Profile("dev")
表明只有Spring定义的Profile为dev时才会实例化DevEmailService这个类。那么如何设置Profile呢?

在配置文件中指定

 
在application.properties中加入:

spring.profiles.active=dev
 通过命令行参数
java -jar app.jar --spring.profiles.active=dev

 

spring.profiles的使用详解 本文来说下spring.profiles.active和spring.profiles.include的使用与区别。 阅读详情

相关推荐

maven: 使用spring.profiles.active实现多环境配置

在项目开发的过程中会用到多个环境比如:本地环境(开发自测)、开发环境(环境部署自测)、生产环境等,由于不同的环境需要不同的配置信息,为了便于开发使用,通常需要使用profiles进行多环境配置。pom文件中添加如下配置。

玉汝于成 1892

SpringBoot配置文件中spring.profiles.active配置详解

SpringBoot配置文件中spring.profiles.active配置详解 1、多环境配置 我们在开发Spring Boot应用时,通常同一套程序会被应用和安装到几个不同的环境,比如:开发、测试、生产等。其中每个环境的数据库地址、服务器端口等等配置都会不同,如果在为不同环境打包时都要频繁修改配置文件的话,那必将是个非常繁琐且容易发生错误的事。 对于多环境的配置,各种项目构建工具或是框架的基本思路是一致的,通过配置多份不同环境的配置文件,再通过打包命令指定需要打包的内容之后进行区分打包,Spring

南瓜的博客 8万+

Spring Profile配置管理:active与include实战解析

Spring Profile是Spring Boot中实现环境隔离的核心机制,通过逻辑分组管理不同环境的配置与Bean定义。其工作原理是基于条件化配置加载,开发者可以灵活切换开发、测试、生产等环境配置。在微服务架构中,Profile技术能有效解决多环境配置差异问题,提升部署效率。实际工程中,spring.profiles.active用于显式激活环境,而spring.profiles.include则实现配置模块化组合,两者配合使用可构建清晰的配置层次结构。本文通过企业级实践案例,详解如何运用Profile

weixin_34099526的博客 362

java编程中spring boot 使用spring.profiles.active来分区配置

java编程中spring boot 使用spring.profiles.active来分区配置   很多时候,我们项目在开发环境和生成环境的环境配置是不一样的,例如,数据库配置,在开发的时候,我们一般用测试数据库,而在生产环境的时候,我们是用正式的数据,这时候,我们可以利用profile在不同的环境下配置用不同的配置文件或者不同的配置 spring boot允许你通过命名约定按照一定的格式

赵树祥的博客 3754

解决 No active profile set, falling back to 1 default profile: “default“问题以及如何查看spring boot版本号

今天,在启动项目时,出现如此错误: No active profile set, falling back to 1 default profile: "default"。这个问题不是错误,因为它的日志级别是info(log.level = info)。经过一番探究之后,才解决了这个问题,同时,在文章末尾演示如何查看spring boot版本号。...............

念兮为美 5万+

抓包工具(五)2025版 Burp Suite Professional的下载、安装、使用

抓包工具(五)2025版 Burp Suite Professional的下载、安装、使用

ACGkaka的博客 2万+

springboot多模块

项目的基本结构 其中 blog-core 是核心模块 blog-tool 是工具模块 blog-api 是前端项目 blog-admin 是后台项目 首先父pom文件 <groupId>com.yf</groupId> <artifactId>zfanblog</artifactId> <version>Z-0.0.1</version> <name>zfanblog</n

qq_36296417的博客 907

java实现mavlink协议解析与封包上传数据,实现mavlink数据交互,附带代码、详解

本篇文章介绍了使用java来进行mavlink协议解析,封包与解包的过程,并附带源码供大家使用。MAVLink(Micro Air Vehicle Link,微型空中飞行器链路通讯协议)是无人飞行器与地面站(Ground Control Station ,GCS)或云端服务器之间通讯,以及无人飞行器之间通讯最常用的协议。它已经在PX4、APM、PIXHAWK和Parrot AR.Drone飞控平台上进行了大量测试。

qq_30279827的博客 1448

spring boot profile配置和启动时no active profile set, falling back to default profiles: default的问题

目录 1.启动时no active profile set, falling back to default profiles: default 2.多profile文件形式: 3.多profile配置激活 3.1通过properties文件指定 3.2通过yml文档块指定 3.3通过configuration中的Program agruments指定 ...

benbenniaono1的博客 25万+

微信支付开发之平台给用户转账到零钱的功能

请求消息中应包含商家批次单号、转账名称、appid、转账总金额、转账总笔数、转账openid、收款用户姓名等信息。批次已受理成功,若发起批量转账的30分钟后,转账批次单仍处于该状态,可能原因是商户账户余额不足等。【转账场景ID】 该批次转账使用的转账场景,如不填写则使用商家的默认场景,如无默认场景可为空,可前往“商家转账到零钱-前往功能”中申请。【转账总笔数】 一个转账批次单最多发起一千笔转账。【商家批次单号】 商户系统内部的商家批次单号,要求此参数只能由数字、大小写字母组成,在商户系统内部唯一。

程序员weixin_sodomany的博客 3450

从零开始掌握OBD-II:汽车诊断开发的核心技术与实战解析

本文深入解析OBD-II汽车诊断系统的核心技术,包括ECU通信协议、故障码解析及诊断工具开发实战。通过详细的协议分析和代码示例,帮助开发者快速掌握汽车诊断开发技能,实现从零到精通的进阶。特别适合从事汽车电子开发和OBD检测的技术人员参考学习。

weixin_42528780的博客 438

spring.profiles.active和spring.profiles.include的使用与区别

spring.profiles.active和spring.profiles.include的区别与使用业务场景优化方式spring.profiles.active属性启动时指定:spring.profiles.include属性配置方法:配置的位置和区别:用示例来使用和区分测试一:测试二:测试三: 业务场景 一套程序可能会被部署到不同的环境。开发、测试、生产环境有不同的配置信息,包括jdbc地址、ip、端口等。如果在同一个配置文件中,每次部署去改配置,会非常麻烦且容易出错。 优化方式 spring.pro

wysghmbb的博客 2万+

基于PSINS的INS/NHC/ODO组合导航仿真全解析

组合导航通过多传感器融合克服单一导航系统的局限,是车辆自主定位的关键技术。其中惯性导航(INS)依靠陀螺仪与加速度计积分推算运动状态,但误差随时间累积;GNSS提供绝对位置,却在城市峡谷中易受多径效应和遮挡影响导致定位漂移。卡尔曼滤波作为信息融合核心,将不同量测按统计特性加权,实现优势互补。基于PSINS开源工具箱搭建的SINS/GNSS/ODO/NHC组合导航仿真,能够在GNSS失锁条件下利用非完整约束和里程计抑制惯性误差发散,广泛应用于无人驾驶、物流车辆自主定位等场景。本文围绕PSINS仿真环境,详细拆

weixin_29044713的博客 253

使用spring.profiles.active

项目在开发环境和生产环境的配置是不一样的,所以我们可以利用profile在不同的环境下,用不同的配置文件 Spring Boot允许通过一定的命名规则(application-{profile}.properties){dev :开发环境、test:测试环境、prod:生产环境}在来定义多个配置文件,然后在application.properties中使用spring.profiles.acti...

tealala的博客 1万+

基于STM32-XPC仿真平台的构架

基于STM32-XPC仿真平台的构架 xPC Target是MathWorks公司的MATLAB提供的一个基于RTW(Real-Time Workshop)体系框架的附加产品,是一种用于产品原型开发、测试和配置实时系统的PC机解决途径。xPC目标实时仿真系统能够使开发者在产品开发前进行产品原型的快速实现、测试和评估,是 Simulink 工具集下用于产品原型开发设计测试集于一体的工具箱。

sujianbonwpu的博客 4487

Android 14.0 SystemUI状态栏居中显示时间和修改时间显示样式

在14.0的系统rom定制化开发中,在systemui状态栏系统时间默认显示在左边和通知显示在一起,但是客户想修改显示位置,想显示在中间,所以就要修改SystemUI 的Clock.java 文件这个就是管理显示时间的,居中显示的话就得修改布局文件了

安卓兼职framework和app工程师的博客 978

springboot的spring.profiles.active配置以及加载多个yml文件

场景:spring.profiles.active配置记录:NO.239本例环境: spring-boot:2.2.0.RELEASE jdk:1.8情景一: 在application.yml中配置spring.profiles.active,在pom.xml中配置profiles标签即, <profiles><profile></profile></profiles> 在resources目录下: 默认:application...

zhangbeizhen18的博客 1万+

33、嵌入式系统中的内存操作与实时操作系统

本博客详细探讨了嵌入式系统中的内存操作和实时操作系统(RTOS)的基本原理及应用。内容涵盖C、C++和MicroPython三种语言下的SDRAM读写示例,并结合机器人真空吸尘器的实际应用说明内存的使用场景。此外,还介绍了RTOS的核心概念、组件及其工作机制,包括任务、事件、互斥锁、信号量、队列等,并以FreeRTOS和Mbed OS为例展示了RTOS的配置与使用方法。最后,通过常见问题和实践项目加深对嵌入式系统开发的理解。

zz67890的博客 145

spring.profiles.active 未生效问题解决

问题解决历程:一开始配置未生效,然后根据网上的描述都配置了个遍,还是没有解决,最终自己发现启动类里面的配置写死了是dev,一直没有按照自己配置的来,我把第4点操作中的active profiles:去除为空之后,就可以了。 配置上面的profiles,右侧maven会出现如下结构,勾选你要运行的环境: 如果spring.profiles.active=local起作用了,可以看到运行窗口出现下面的标识:...

m0_67393619的博客 1万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

springboot启动spring.profiles.active和spring.profiles.include影响的区别

application.properties文件内容 spring.profiles.active=test4 pring.profiles.include=test3,test5 version=1 name=Tom application-test2.properties文件内容 pring.profiles.include=test3,test4 version=2 applicatio...

happyblueice的博客 1万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

spring-boot启动时,指定spring.profiles.active

Maven启动指定Profile通过-P, 如mvn spring-boot:run -Ptest 但这是Maven的Profile。 如果要指定spring-boot的spring.profiles.active, spring-boot 1.x 使用mvn spring-boot:run -Drun.profiles=test, spring-boot 2.x 使用mvn spring-boot:run -Dspring-boot.run.profiles=test。 参考资料:https://docs

m0_67266787的博客 9887

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

spring.profiles.active和spring.profiles.include的使用及区别说明

application.properties中,配置spring.profiles.active=dev的同时指定spring.profiles.include=dev1,dev2。application.properties中,配置spring.profiles.active=dev,application-dev.properties中。spring.profiles.active=dev:用application-dev.properties。

2509_93970086的博客 892

Spring Profile配置详解:active与include实战技巧

Spring Profile是Spring Boot实现多环境配置管理的核心机制,通过环境隔离确保不同部署场景的配置独立性。其原理基于profile激活(active)与配置组合(include)两大功能,active通过环境变量或配置文件指定运行时环境,include则实现配置模块化继承。在微服务架构中,合理使用profile能有效解决开发、测试、生产环境的配置差异问题,特别是结合CI/CD流水线时,可避免环境配置混用风险。本文以spring.profiles.active和spring.profiles

weixin_33726318的博客 424
上一篇: kafka 分区 leader 选举机制原理
下一篇: [推荐]新浪微博如何实现 SSO 的分析
大树叶
博客等级 码龄12年 1171粉丝 664原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值