22、springboot 的 Profile(通过yml配置文件配置 profile,快速切换项目的开发环境)_springboot profiles-程序员宅基地

技术标签: Spring Boot 系列  spring boot  后端  数据库  

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

智能推荐

Unity有哪些让做项目事半功倍的插件值得推荐?_qhierarchy 下载-程序员宅基地

文章浏览阅读3.1k次。Unity开发最好的地方就是有各种强大的插件,有哪些插件让大家事半功倍,稳定强大 值得推荐学习和入手呢?Unity5.0之后,制作UI 以及UI的动画,UI特效,大家一般都使用什么插件?或者说有什么好的插件推荐?关于特效制作,大家又有什么好的插件使用经验?请大家分享下各自的项目经验和插件推荐吧。添加评论 分享按投票排序按时间排序_qhierarchy 下载

UNITY_LIGHT_ATTENUATION, 光照衰减-程序员宅基地

文章浏览阅读5.5k次,点赞4次,收藏13次。用于计算光照衰减系数。参数一为返回值(光照衰减系数),参数二用于阴影计算,参数三是世界坐标实现代码位于AutoLight导入文件之中,使用之前需要#include "AutoLight.cginc"源码:_LightTexture0解析:https://blog.csdn.net/zengjunjie59/article/details/109532962unity_WorldToLight :用于把顶点从世界空间转换到光源空间(https://blog.csdn.net/zengjun_unity_light_attenuation

NR系统概述-架构与演进-程序员宅基地

文章浏览阅读2.8k次,点赞7次,收藏14次。大家好,从今天开始我会把NR相关的知识以博文的方式放上来。可能速度会比较慢,时间也会拉得很长,因为内容比较多,我还在整理中,而且很多内容关联性很强,我得考虑介绍的先后顺序。从我学习3GPP的经验考虑,我大概的思路是这样的:1. 介绍NR的一些背景知识,主要是架构与演进。2. 介绍NR的主要无线技术。3. 介绍5G NR一些专有概念,其中主要是5G 帧结构和相关的物理资源的组成单位。4.然后把5G NR无线频谱相关的内容介绍一下,不会太细。只是笼络地把相关知识点梳理一遍,当然,如果您是专门做._nr

在arm上移植eSpeak-1.48.04_espeak交叉编译-程序员宅基地

文章浏览阅读3.1k次。开发板运行系统:32位linux主机 ubuntu17.041、下载portaudio_v18_1.ziphttp://www.portaudio.com/download.html2、下载eSpeak-1.48.04-source.ziphttp://espeak.sourceforge.net/download.html3、交叉编译por_espeak交叉编译

div背景透明度动态改变的效果_css动态增加div透明度-程序员宅基地

文章浏览阅读338次。目标:使用定时器实现div背景色的透明度动态改变注意:这里没有进行兼容处理,别使用低版本的ie游览器!!!代码: <!doctype html><html> <head> <title>div背景透明度动态改变的效果</title> <meta charset="utf-8" /> </head> <body> <div class="_css动态增加div透明度

使用yum install和reposync下载rpm安装包以及wget和curl下载文件_yum下载-程序员宅基地

文章浏览阅读5k次。记录:311场景:在CentOS 7.9操作系统,使用yum install --downloadonly命令下载rpm安装包和依赖包;使用reposync命令下载远程yum源镜像仓库;使用wget命令下载指定文件;使用curl下载指定文件。_yum下载

随便推点

postgres的update_time设置_postupdatetime-程序员宅基地

文章浏览阅读2.5k次。create or replace function upd_timestamp() returns trigger as$$begin new.update_time = current_timestamp; return new;end$$language plpgsql;create or replace function cre_timestamp() returns tr..._postupdatetime

linux下加载so文件_native.loadlibrary linux so文件-程序员宅基地

文章浏览阅读2.9k次。记一下最近碰到的一个加载so文件的问题简介:so文件就是C编译后的文件。适用于linux系统。windows中使用的是dll。java中的调用方式很简单:HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary("hcnetsdk", HCNetSDK.class);这里采用的是jna 。采用maven的可以导入jna的依赖。采用gradle以及未采用maven方式的可以放jar。gradle这里如果想放jar的话,需要:c_native.loadlibrary linux so文件

贝叶斯实现文本分类C++实现-程序员宅基地

文章浏览阅读1k次。//NaiveBayes.h#ifndef NAIVEBAYES_H_#define NAIVEBAYES_H_#include#include#include#include#include#include#include#include#include#includeusing namespace std;class NaiveBayes{private:

理解和使用索引+事务+存储引擎(Mysql5.7)_mysql5.7 的需要事务如何选取引擎-程序员宅基地

文章浏览阅读210次。目录1. 索引概述2. 存储引擎概述3. 事务概述1. 索引概述2. 存储引擎概述3. 事务概述_mysql5.7 的需要事务如何选取引擎

实现用户的登录,并且登录后显示用户名_jquery - 登陆成功后,右上角显示用户名怎么做-程序员宅基地

文章浏览阅读1.7w次,点赞13次,收藏125次。利用servlet,jsp实现用户的登录,并且登录后显示用户名(连接数据库)显示用户名这里是通过session传递数据,登陆成功后点击退出时要清除页面session。使用软件:tomcat-8.5.34,mysql,java我们一共需要写:位于src下的服务器端用于登录的LoginServlet,登陆成功后用于退出的SuccessServlet位于web下的前端登录页面login.html,登陆成功后的页面success.jsp,登录失败的页面error.html;首先我们来写登录的服务器端_jquery - 登陆成功后,右上角显示用户名怎么做

西门子TIA V17发布,附下载链接<EKB>_wincccomfort v17百度网盘-程序员宅基地

文章浏览阅读7.5k次。3 Startdrive V16相关下载链接可以通过如下网址获取软件和相关的手册信息:Startdrive V16 下载地址:https://support.industry.siemens.com/cs/af/en/view/109771710Startdrive V17下载地址:链接:https://pan.baidu.com/s/1jw3N_yjQ1jYefRd8dxgvdQ提取码:JNBSS120 Start..._wincccomfort v17百度网盘

推荐文章

热门文章

相关标签