22、springboot的Profile(通过yml配置文件配置 profile,快速切换项目的开发环境)
springboot的Profile
★ 何谓Profile
应用所在的运行环境发生切换时,配置文件常常就需要随之修改。Profile:——就是一组配置文件及组件的集合。可以整个应用在不同的profile之间切换(设置活动profile),整个应用都将使用该profile对应的配置文件及组件。——每个运行环境(开发、测试、上线)都配置成一个对应profile,这样以后只要修改一下活动profile,应用就可以轻易地在不同的运行环境之间自由切换。
就是通过 配置的 profile 快速切换开发环境。
▲ 1. 声明Profile
- @Profile修饰Spring组件(@Component、@Configuration、@ConfigurationProperties),意味着该组件仅对特定profile有效。- 在配置文件中添加profile名,意味着该配置文件仅对特定profile生效。- 多profile的配置文件。
▲ 2. 设置活动Profile
spring.profiles.active属性指定激活哪个Profile——该属性可通过任意的外部配置源来指定。
★ 通用配置文件 和 Profile特定的配置文件 的区别
通用配置文件: application.properties或者application.ymlprofile相关: application-{profile名}.properties或者application-{profile名}.ymlprofile相关的配置文件的优先级更高(后加载,后加载的会覆盖前面加载的)就是我们要弄一个叫 abc.profile 的配置文件,那么就可以这样写 application-abc.properties/yml
(中划线 - 加上 profile 名字)
代码演示:
演示如何通过profile配置文件,来快速切换开发环境。
步骤:
1、
添加一个正式环境用的yml----application-dev.yml,写对应的正式环境配置
添加一个测试环境用的yml----application-test.yml,写对应的测试环境配置
一个原本有的通用的application.yml—用来切换开发环境和测试环境
演示通过 application.yml 配置文件中,通过指定对应的 profile 名字,来切换开发环境

演示 用 java 类来查看
类用 @Profile 注解 来修饰
@Profile(“dev”) //注解作用:表示这个控制器仅对dev作为活动profile时才生效(就是把开发环境切换成 dev ,这个控制器才生效)

application.yml配置文件中使用 spring.profiles.active 属性,用于切换活动profile,意味着最终最多时能有一个活动profile,就是最终只能有一个开发环境,要么正式,要么测试,要么其他,只能有一个开发环境。
但是如果在application.yml 配置文件中,使用 spring.profiles.include属性 用于添加活动profile,意味着最终可能有多个活动profile,目前来看是多个profile修饰的controller生效。
一开始我以为是多个开发环境生效,比如正式环境和测试环境都生效,后面发现是覆盖的关系,看起来还是只有一个开发环境
新增的活动profile -> add 和 原来的活动profile -> dev ,其实它们会覆盖,但是具体谁覆盖谁,是不确定的。
下面演示添加活动profile
★ 添加活动Profile
▲ spring.profiles.include - 添加新的活动profile
原有的,继续生效。没有的,新增。相同的,覆盖——Spring Boot并不确定使用新增profile覆盖原有的profile
▲ 调用SpringApplication的setAdditionalProfiles()来添加新的活动Profile
通过添加活动Profile,实际上就相当于让应用有了多个活动Profile。【备注】:spring.profiles.active属性用于切换活动profile,意味着最终最多时能有一个活动profilespring.profiles.include属性用于添加活动profile,意味着最终可能有多个活动profile
如果在application.yml 配置文件中,使用 spring.profiles.include属性 用于添加活动profile,意味着最终可能有多个活动profile,目前来看是多个profile修饰的controller生效。
一开始我以为是多个开发环境生效,比如正式环境和测试环境都生效,后面发现是覆盖的关系,看起来还是只有一个开发环境
新增的活动profile -> add 和 原来的活动profile -> dev ,其实它们会覆盖,但是具体谁覆盖谁,是不确定的。
代码示例:
添加一个活动profile

2、使用这个新添加的活动profile,有两种方式:
方式1:在启动类添加,用 ctx.setAdditionalProfiles(“add”); 方法

方式2:在 application.yml 配置文件中添加,用 spring.profiles.include 属性

执行结果
application.yml 配置文件启动的profile 有 dev 和 add 两个开发环境,启动后使用的端口号是 add 的 8085

访问结果测试:
可以看出 当 application.yml 指定了 dev 和 add 两个开发环境后,只有 dev 和 add 两个controller 生效(生效:能访问到对应的被profile注解修饰的controller的方法),
但是开发环境是 add 覆盖了 dev 。
而test 开发环境 和 controller 都没生效。

★ Profile组
Profile组可以让一个应用里面有多个profile
Profile组也是一个Profile,但该Profile可包含另外几个Profile。例如:spring.profiles.group.prod[0]=banner
spring.profiles.group.prod[1]=server上面定义了一个Profile组:prod,该组包含banner和server两个Profile。因此如果将上面prod设为活动Profile,那就意味着项目中有3个活动profile,依次是prod、banner、server——通过使用这种方式,可以让项目设置多个活动Profile。
▲ Profile组及其成员的加载顺序:
先加载Profile组对应的资源(比如先加载prod)
然后按顺序加载各组成员Profile对应的资源(比如再加载banner、server)。
后加载的能覆盖先加载的。——Profile组 对应的资源,总会被组成员对应的资源所覆盖。
【备注:】通过使用Profile组,可以设置多个活动profile,且它们的覆盖顺序是相当稳定的。
先加载组,然后再加载组里面的成员,后加载的会覆盖前面的。
代码演示:
需求:演示 profile 组 和 其成员的加载顺序。
1、先在application.yml 中设置一个profile组,叫gp,
然后创建一个 profile 叫 application-gp.yml
【spring.profiles.active属性用于切换活动profile,意味着最终最多时能有一个活动profile】
如图:可以看出用 active ,表示切换到 gp 这个profile ,所以最先加载的就是这个 gp profile,
然后再加载 gp 这个组里面的成员,加载顺序可以看成是按我们写的顺序从上往下,如图中,先加载 dev 这个 profile ,然后再加载 test 这个 profile。
加载顺序为:gp – dev – test
因为后加载的profile 会覆盖 先加载的profile,所以最终执行的 profile 就是 test 这个

访问各个profile的方法,验证加载顺序

可以看出来:
1、启动程序后,访问的端口是8084,因为test这个profile配置文件的端口就是8084,说明test是最后加载的,覆盖了前面的几个profile。
2、然后访问每个 profile 的控制器的方法,发现 gp、dev、test 都能访问成功,只有add这个profile访问失败,因为从上面的 application.yml 配置文件可以看出只配置了 gp、dev、test 这三个profile。而add这个没有配置,肯定访问失败
3、可以看出无论是访问 gp这个profile组,还是访问 dev、test 这两个活动profile,返回的结果都是 test 这个profile 的数据。说明因为配置了 gp、dev、test 这三个profile,所以表示gp、dev、test这三个控制器都生效,就是这三个开发环境都生效了。
但是因为test最后加载,把前面的gp和dev都覆盖了,所以最终的开发环境就是以test这个profile为主。

★ 混合复合类型
混合复合类型,其实就是多个profile的覆盖规则。
1. 若可从多个配置文件中加载List类型的属性时,后加载的List集合总是完全替换之前加载List集合。比如从第一个配置文件中加载的List集合包含2个元素,接着从第二个配置文件中加载的List集合包含1个元素,那么这个List集合属性最终就只有一个元素。2. 若可从多个配置文件中加载Map类型的属性时,后加载的Map的key-value对将会添加到之前加载Map中。比如先从第一个配置文件中加载的Map包含2个key-value对,接着从第二个配置文件中加载的Map集合包含1个key-value对、且该key-value与之前的两个key-value对不冲突,那么这个Map属性最终会包含3个key-value对。【归纳】: List集合是完全覆盖,Map集合则是元素添加。
代码演示:
需求:演示 profile 里面的 list (覆盖)和 Map (添加)

定义这个属性处理类,作用是:拿对应的yml配置文件中的值

这个是控制器中的方法,通过访问,能更直观的看到数据

测试结果: List集合是完全覆盖,Map集合则是元素添加。
★ 根据环境自动更新Profile(多Profile的配置文件)
可使用三个减号(---)将一份.yml配置文件分割成逻辑上的多个片段(*.properties文件使用#---进行分割),然
后可通过如下属性指定各片段“条件性”生效:▲ spring.config.activate.on-profile:指定此行配置以下的配置仅当指定Profile激活时才有效。该属性值也支持使用取反运算符(!),比如“!dev”表示非dev Profile时有效。▲ spring.config.activate.on-cloud-platform:指定此行配置以下的配置仅当处于指定云平台上时才有效。如果使用此行配置,意味着该应用可根据部署的云平台自动切换它的配置片段(Profile)【本质】:就是将多个针对特定Profile的配置文件合并到一起。
代码示例:
总结这个:根据环境自动更新Profile,就是上面我们创建很多yml配置文件,一个profile就创建一个yml配置文件,
如:application-dev.yml,application-gp.yml,application-test.yml,然后这三个活动profile需要在application.yml 里面进行指定加载一个或者多个。
现在的需求:就是把application-dev.yml,application-gp.yml,application-test.yml这三个profile的代码直接全部都写在application.yml 这个配置文件就行了,就不用创建那么多的application-xxxprofile.yml 的文件了。
三个配置文件的数据,放在同一份yml中,需要用 — 这三个减号进行分割,表示分成一个一个片段。
代码:
把dev和test这两个profile配置文件的代码都添加到 application.yml这个配置文件里面,然后把原本各自的application-dev.yml,application-test.yml 里面的数据注释掉

现在只指定了 dev ,所以也只有dev这个开发环境能生效。
访问测试:
测试结果发现跟自己预料的不一样。
如上面的图可以看到指定的是 dev 开发环境,然后dev 这个片段在9-30行,test在31-52行,启动项目后,发现第6行无论是指定dev还是test,最终加载的都是test这个开发环境,就像是test把dev覆盖了一样。
如图:按理说启动后端口应该是dev的8083

相关文章:
22、springboot的Profile(通过yml配置文件配置 profile,快速切换项目的开发环境)
springboot的Profile ★ 何谓Profile 应用所在的运行环境发生切换时,配置文件常常就需要随之修改。Profile:——就是一组配置文件及组件的集合。可以整个应用在不同的profile之间切换(设置活动profile),整个应用都将使…...
2023-08-12力扣每日一题-暴力hard
链接: 23. 合并 K 个升序链表 题意: 如题 解: 时间668ms击败 5.00%使用 C 的用户/内存12.37mb击败 87.96%使用 C 的用户 循环选择插入新链表的节点,纯正的暴力,不过空间用得少 最坏应该是1E4*1E4,没…...
Mac安装nvm教程及使用
nvm 是 node 版本管理器,也就是说一个 nvm 可以管理多个 node 版本(包含 npm 与 npx),可以方便快捷的安装、切换 不同版本的 node。 1、直接通过brew安装 执行命令:brew install nvm PS: 如果没有安装br…...
左值引用和右值引用
目录 辨析引用和指针 代码段 定义引用变量的技巧 同一内存 指针和引用的简单运用 辨析两类指针 数组、指针、引用 辨析左值引用和右值引用 代码段 左值引用和右值引用 辨析引用和指针 1、引用是一种更安全的指针 说明:引用必须初始化,而指针可…...
JavaWeb 中对 HTTP 协议的学习
HTTP1 Web概述1.1 Web和JavaWeb的概念1.2 JavaWeb技术栈1.2.1 B/S架构1.2.2 静态资源1.2.3 动态资源1.2.4 数据库1.2.5 HTTP协议1.2.6 Web服务器 1.3 Web核心 2 HTTP2.1 简介2.2 请求数据格式2.2.1 格式介绍2.2.2 实例演示 2.3 响应数据格式2.3.1 格式介绍2.3.2 响应状态码2.3.…...
06-hadoop集群搭建(root用户)
搭建Hadoop集群流程 环境准备 1、基础环境的搭建(内网封火墙关闭、主机名、规划好静态ip、hosts映射、时间同步ntp、jdk、ssh免密等) 2、Hadoop源码编译(为了适应不同操作系统间适配本地库、本地环境等) 3、Hadoop配置文件的修…...
MySQL 窗口函数是什么,有这么好用
先看这段像天书一样的 SQL ,看着就头疼。 SELECTs1.name,s1.subject,s1.score,sub.avg_score AS average_score_per_subject,(SELECT COUNT(DISTINCT s2.score) 1 FROM scores s2 WHERE s2.score > s1.score) AS score_rank FROM scores s1 JOIN (SELECT subject, AVG(sco…...
用户数据报协议UDP
UDP的格式 载荷存放的是:应用层完整的UDP数据报 报头结构: 源端口号:发出的信息的来源端口目的端口号:信息要到达的目的端口UDP长度:2个字节(16位),即UDP总长度为:2^16bit 2^10bit * 2^6bit 1KB * 64 64KB.所以一个UDP的最大长度为64KBUDP校验和:网络的传输并非稳定传输,…...
STM32F429IGT6使用CubeMX配置外部中断按键
1、硬件电路 2、设置RCC,选择高速外部时钟HSE,时钟设置为180MHz 3、配置GPIO引脚 4、NVIC配置 PC13相同 5、生成工程配置 6、部分代码 中断回调函数 /* USER CODE BEGIN 0 */void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {if(GPIO_Pin GPIO_PIN_0){HAL_GPIO…...
时序预测 | Python实现LSTM长短期记忆网络时间序列预测(电力负荷预测)
时序预测 | Python实现LSTM长短期记忆网络时间序列预测(电力负荷预测) 目录 时序预测 | Python实现LSTM长短期记忆网络时间序列预测(电力负荷预测)效果一览基本描述模型结构程序设计参考资料效果一览...
[开发|前端] 路由守卫笔记
描述 vue-router提供的导航跳转或取消的api。 router.beforeEach 切换路由前调用 router.beforeResolve 组件内路由守卫解析之后调用,和beforeEach用法类似 router.afterEach 切换后调用 全局路由守卫有上面3个,调用时机不同 路由守卫都有3个参数 …...
网络基础——网络的由来与发展史
作者:Insist-- 个人主页:insist--个人主页 作者会持续更新网络知识和python基础知识,期待你的关注 目录 一、网络的由来 二、计算机网络的发展史 1、第一阶段 2、第二阶段 3、第三阶段 前言 每天都是使用网络,那么你知道网络…...
八数码(bfs)
思路: (1)用string来存储状态,用d<string,int>来记录状态变换次数; (2)在bfs过程中,先初始化(q,d);每次拿出队头状态,得到x的相对位置&am…...
CCLINK IE FIELD BASIC转MODBUS-TCP网关cclink与以太网的区别
协议的不同,数据读取困难,这是很多生产管理系统的难题。但是现在,捷米JM-CCLKIE-TCP通讯网关,让这个问题变得非常简单。这款通讯网关可以将各种MODBUS-TCP设备接入到CCLINK IE FIELD BASIC网络中,连接到MODBUS-TCP总线…...
【Rust】Rust学习 第十一章编写自动化测试
Rust 是一个相当注重正确性的编程语言,不过正确性是一个难以证明的复杂主题。Rust 的类型系统在此问题上下了很大的功夫,不过它不可能捕获所有种类的错误。为此,Rust 也在语言本身包含了编写软件测试的支持。 编写一个叫做 add_two 的将传递…...
关于使用pycharm遇到只能使用unittest方式运行,无法直接选择Run
相信大家可能都遇到过这个问题,使用pycharm直接运行脚本的时候,只能选择unittest的方式,能愁死个人 经过几次各种尝试无果之后,博主就放弃死磕了,原谅博主是个菜鸟 后来遇到这样的问题,往往也就直接使用cm…...
Docker+rancher部署SkyWalking8.5并应用在springboot服务中
1.Skywalking介绍 Skywalking是一个国产的开源框架,2015年有吴晟个人开源,2017年加入Apache孵化器,国人开源的产品,主要开发人员来自于华为,2019年4月17日Apache董事会批准SkyWalking成为顶级项目,支持Jav…...
代码随想录第45天 | 322. 零钱兑换、279. 完全平方数
322. 零钱兑换 动规五部曲分析如下: 确定dp数组以及下标的含义 dp[j]:凑足总额为j所需钱币的最少个数为dp[j] 确定递推公式 凑足总额为j - coins[i]的最少个数为dp[j - coins[i]],那么只需要加上一个钱币coins[i]即dp[j - coins[i]] 1就是…...
怎么加入Microsoft Cloud Partner Program?
目录 前言 加入Microsoft Cloud Partner Program 1、注册成为微软合作伙伴 2、完成合作伙伴资格要求...
LNMP简易搭建
目录 前言 一、拓扑图 二、NGINX配置 三、配置MySQL 四、配置php环境 五、部署应用 总结 前言 LNMP平台指的是将Linux、Nginx、MySQL和PHP(或者其他的编程语言,如Python、Perl等)集成在一起的一种Web服务器环境。它是一种常用的开发和部署网…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
