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

智能推荐

class和struct的区别-程序员宅基地

文章浏览阅读101次。4.class可以有⽆参的构造函数,struct不可以,必须是有参的构造函数,⽽且在有参的构造函数必须初始。2.Struct适⽤于作为经常使⽤的⼀些数据组合成的新类型,表示诸如点、矩形等主要⽤来存储数据的轻量。1.Class⽐较适合⼤的和复杂的数据,表现抽象和多级别的对象层次时。2.class允许继承、被继承,struct不允许,只能继承接⼝。3.Struct有性能优势,Class有⾯向对象的扩展优势。3.class可以初始化变量,struct不可以。1.class是引⽤类型,struct是值类型。

android使用json后闪退,应用闪退问题:从json信息的解析开始就会闪退-程序员宅基地

文章浏览阅读586次。想实现的功能是点击顶部按钮之后按关键字进行搜索,已经可以从服务器收到反馈的json信息,但从json信息的解析开始就会闪退,加载listview也不知道行不行public abstract class loadlistview{public ListView plv;public String js;public int listlength;public int listvisit;public..._rton转json为什么会闪退

如何使用wordnet词典,得到英文句子的同义句_get_synonyms wordnet-程序员宅基地

文章浏览阅读219次。如何使用wordnet词典,得到英文句子的同义句_get_synonyms wordnet

系统项目报表导出功能开发_积木报表 多线程-程序员宅基地

文章浏览阅读521次。系统项目报表导出 导出任务队列表 + 定时扫描 + 多线程_积木报表 多线程

ajax 如何从服务器上获取数据?_ajax 获取http数据-程序员宅基地

文章浏览阅读1.1k次,点赞9次,收藏9次。使用AJAX技术的好处之一是它能够提供更好的用户体验,因为它允许在不重新加载整个页面的情况下更新网页的某一部分。另外,AJAX还使得开发人员能够创建更复杂、更动态的Web应用程序,因为它们可以在后台与服务器进行通信,而不需要打断用户的浏览体验。在Web开发中,AJAX(Asynchronous JavaScript and XML)是一种常用的技术,用于在不重新加载整个页面的情况下,从服务器获取数据并更新网页的某一部分。使用AJAX,你可以创建异步请求,从而提供更快的响应和更好的用户体验。_ajax 获取http数据

Linux图形终端与字符终端-程序员宅基地

文章浏览阅读2.8k次。登录退出、修改密码、关机重启_字符终端

随便推点

Python与Arduino绘制超声波雷达扫描_超声波扫描建模 python库-程序员宅基地

文章浏览阅读3.8k次,点赞3次,收藏51次。前段时间看到一位发烧友制作的超声波雷达扫描神器,用到了Arduino和Processing,可惜啊,我不会Processing更看不懂人家的程序,咋办呢?嘿嘿,所以我就换了个思路解决,因为我会一点Python啊,那就动手吧!在做这个案例之前先要搞明白一个问题:怎么将Arduino通过超声波检测到的距离反馈到Python端?这个嘛,我首先想到了串行通信接口。没错!就是串口。只要Arduino将数据发送给COM口,然后Python能从COM口读取到这个数据就可以啦!我先写了一个测试程序试了一下,OK!搞定_超声波扫描建模 python库

凯撒加密方法介绍及实例说明-程序员宅基地

文章浏览阅读4.2k次。端—端加密指信息由发送端自动加密,并且由TCP/IP进行数据包封装,然后作为不可阅读和不可识别的数据穿过互联网,当这些信息到达目的地,将被自动重组、解密,而成为可读的数据。不可逆加密算法的特征是加密过程中不需要使用密钥,输入明文后由系统直接经过加密算法处理成密文,这种加密后的数据是无法被解密的,只有重新输入明文,并再次经过同样不可逆的加密算法处理,得到相同的加密密文并被系统重新识别后,才能真正解密。2.使用时,加密者查找明文字母表中需要加密的消息中的每一个字母所在位置,并且写下密文字母表中对应的字母。_凯撒加密

工控协议--cip--协议解析基本记录_cip协议embedded_service_error-程序员宅基地

文章浏览阅读5.7k次。CIP报文解析常用到的几个字段:普通类型服务类型:[0x00], CIP对象:[0x02 Message Router], ioi segments:[XX]PCCC(带cmd和func)服务类型:[0x00], CIP对象:[0x02 Message Router], cmd:[0x101], fnc:[0x101]..._cip协议embedded_service_error

如何在vs2019及以后版本(如vs2022)上添加 添加ActiveX控件中的MFC类_vs添加mfc库-程序员宅基地

文章浏览阅读2.4k次,点赞9次,收藏13次。有时候我们在MFC项目开发过程中,需要用到一些微软已经提供的功能,如VC++使用EXCEL功能,这时候我们就能直接通过VS2019到如EXCEL.EXE方式,生成对应的OLE头文件,然后直接使用功能,那么,我们上篇文章中介绍了vs2017及以前的版本如何来添加。但由于微软某些方面考虑,这种方式已被放弃。从上图中可以看出,这一功能,在从vs2017版本15.9开始,后续版本已经删除了此功能。那么我们如果仍需要此功能,我们如何在新版本中添加呢。_vs添加mfc库

frame_size (1536) was not respected for a non-last frame_frame_size (1024) was not respected for a non-last-程序员宅基地

文章浏览阅读785次。用ac3编码,执行编码函数时报错入如下:[ac3 @ 0x7fed7800f200] frame_size (1536) was not respected for anon-last frame (avcodec_encode_audio2)用ac3编码时每次送入编码器的音频采样数应该是1536个采样,不然就会报上述错误。这个数字并非刻意固定,而是跟ac3内部的编码算法原理相关。全网找不到,国内音视频之路还有很长的路,音视频人一起加油吧~......_frame_size (1024) was not respected for a non-last frame

Android移动应用开发入门_在安卓移动应用开发中要在活动类文件中声迷你一个复选框变量-程序员宅基地

文章浏览阅读230次,点赞2次,收藏2次。创建Android应用程序一个项目里面可以有很多模块,而每一个模块就对应了一个应用程序。项目结构介绍_在安卓移动应用开发中要在活动类文件中声迷你一个复选框变量

推荐文章

热门文章

相关标签