springboot 的 Profile

什么是 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.yml

profile相关: application-{profile名}.properties或者application-{profile名}.yml

profile相关的配置文件的优先级更高(后加载,后加载的会覆盖前面加载的)

就是我们要弄一个叫 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,意味着最终最多时能有一个活动profile

spring.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

————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/weixin_44411039/article/details/132159778

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

onvif协议相关:4.1.6 Digest方式云台控制启动

背景 关于onvif的其实很早之前我已经在专栏中写了不少了, 使用onvif协议操作设备 但最近有陆陆续续的粉丝问我, 希望我在写一些关于 onvif的设备自动发现、预置位跳转、云台操作的博客。 满足粉丝的需求,安排。 今天我们来实现 设备云台的控制(启动) 实现 1.在ONVIF Devi…

【JAVA毕业设计】基于Vue和SpringBoot的农机电招平台

本文项目编号 T 615 ,文末自助获取源码 \color{red}{T615,文末自助获取源码} T615,文末自助获取源码 随着农机电招行业的不断发展,农机电招在现实生活中的使用和普及,农机电招行业成为近年内出现的一个新行业&#x…

基于Jmeter的分布式压测环境搭建及简单压测实践

写在前面 平时在使用Jmeter做压力测试的过程中,由于单机的并发能力有限,所以常常无法满足压力测试的需求。因此,Jmeter还提供了分布式的解决方案。本文是一次利用Jmeter分布式对业务系统登录接口做的压力测试的实践记录。按照惯例&#xff0…

代码随想录算法训练营day41|动态规划04

最后一块石头的重量|| 返回剩余最后一块石头石头最小的可能重量,那么就应该最后剩余的两块石头尽量都等于或接近总重量的一半,这样剩下的就是一半的质量 目标和 给定一个非负整数数组,a1, a2, …, an, 和一个目标数,S。现在你有…

Python+Flask实现随机选谷票游戏

西方曾进行一项著名的投资随机性实验,对比基金经理与猴子在选股上的表现。 实验方法:主持人提供一系列股票,基金经理依靠其专业知识(如财务报表、行业趋势、产品市场及公司文化与管理层分析等)进行筛选;而…

【Python数据可视化分析实战】数据爬取—京东手机品牌信息数据爬取和数据分析与可视化

大数据分析设计方案 1.数据集来源:https://search.jd.com 2.实现思路: (1)数据爬取 首先,我们需要从京东平台上采集手机品牌的相关数据。可以通过网络爬虫或API接口等方式获取数据。为了保证数据的完整性和准确性&…

使用 TensorFlow 实现 ZFNet 进行 MNIST 图像分类

ZFNet(ZF-Net)是由 Matthew Zeiler 和 Rob Fergus 提出的卷积神经网络架构,它在图像分类任务中取得了显著的效果。它在标准卷积神经网络(CNN)的基础上做了一些创新,例如优化了卷积核大小和池化策略&#xf…

11.15 HTML

传统路线 HTML、CSS、JS AjaxJQueryMySQLJDBCServletJSPEL&JSTLCookieSessionFilterServlet案例MybatisSpringSpringMVCSpringBoot 全新路线 HTM、CSS、JSAjax、AxiosVue、Element前端工程化 vue脚手架MavenSpringBoot基础 基于SpringBoot进行讲解Spring的IOC&#xff…

打造旅游卡服务新标杆:构建SOP框架与智能知识库应用

随着旅游业的蓬勃兴起,旅游卡产品正逐渐成为市场的焦点。为了进一步提升服务质量和客户体验,构建一套高效且标准化的操作流程(SOP)变得尤为重要。本文将深入探讨如何构建旅游卡的SOP框架,并介绍如何利用智能知识库技术…

Java 简单家居开关系统

1.需求: 面向对象编程实现智能家居控制系统(简单的开关) 2.实现思路 1.定义设备类:创建设备对象代表家里的设备 JD类: import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;D…

Github客户端工具github-desktop使用教程

文章目录 1.客户端工具的介绍2.客户端工具使用感受3.仓库的创建4.初步尝试5.本地文件和仓库路径5.1原理说明5.2修改文件5.3版本号的说明5.4结合码云解释5.5版本号的查找 6.分支管理6.1分支的引入6.2分支合并6.3创建测试仓库6.4创建测试分支6.5合并分支6.6合并效果查看6.7分支冲…

3D Gaussian Splatting的全面理解

1.概述 高斯展开是一种表示 3D 场景和渲染新视图的方法,在“用于实时辐射场渲染的 3D 高斯展开” 中介绍。它可以被认为是类似 NeRF 的模型的替代品,就像过去的 NeRF 一样,高斯飞溅导致了许多新的研究工作,他们选择将其用作各种用例的 3D 世界的底层表示。那么它有什么特别…

Arcgis地图实战三:自定义导航功能的实现

文章目录 1.最终效果预览2.计算两点之间的距离3.将点线画到地图上4.动态展示点线的变化5.动态画线6.动态画点 1.最终效果预览 2.计算两点之间的距离 let dis this.utilsTools.returnDisByCoorTrans(qdXYData, zdXYData, "4549")当距离小于我们在配置文件中预设置的…

【Mysql】Mysql的多表查询---多表联合查询(中)

1、外连接查询 外连接 查询分为左外连接(left outer join), 右外连接查询(right outer join) ,满外连接查询(full outer join). 注意:oracle 里面有full join &#xf…

Linux:进程状态

文章目录 前言一、初识fork1.1 fork函数的介绍1.2 fork出的子进程存在形式1.3 写时拷贝 二、进程的状态2.1 Linux内核源代码2.2 理解内核链表(重要)2.3 运行状态2.4 阻塞状态2.5 挂起状态 三、Z(zombie)状态 ,僵尸进程四、 孤儿进程总结 前言…

qml显示加载嵌入QWidget窗口

本篇博客介绍如何在qml界面里显示QWidget窗口,开发环境Qt6.5.3 qml. 视频讲解:https://edu.csdn.net/learn/40003/654001?spm=3001.4143 qml和QWidget是两套独立的开发方式,二者的窗口可以相互嵌套显示,本篇博客介绍把QWidget窗口封装为动态库,然后在QML的窗口里显示出来…

【MySQL】多表查询

5. 多表查询 5.1 多表关系 项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种&#…

2024-11-16 串的存储结构

一、顺序存储。 1.首先定一个静态数组,然后定义i记录串的实际长度。(缺点:长度不可变) 2.使用malloc申请动态空间,定义指针指向串的地址。(需手动ferr) 方案一: 数组末尾记录长度 …

nodejs21: 快速构建自定义设计样式Tailwind CSS

Tailwind CSS 是一个功能强大的低级 CSS 框架,只需书写 HTML 代码,无需书写 CSS,即可快速构建美观的网站。 1. 安装 Tailwind CSS React 项目中安装 Tailwind CSS: 1.1 安装 Tailwind CSS 和相关依赖 安装 Tailwind CSS: npm…

Windows 安装Docker For Desktop概要

Windows 安装docker 下载部分的工作需要使用科学技术。如果没有可以联系博主发送已下载好的文件。 本文档不涉及技术的讲解,仅有安装的步骤。 准备工作 包含下载与环境准备,下载的文件仅下载,在后续步骤进行安装。 微软关于wsl的文档&…