22、springboot的Profile(通过yml配置文件配置 profile,快速切换项目的开发环境)

这篇具有很好参考价值的文章主要介绍了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.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 名字,来切换开发环境
springboot profiles,Spring Boot,spring boot,数据库,后端

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

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
springboot profiles,Spring Boot,spring boot,数据库,后端
2、使用这个新添加的活动profile,有两种方式:
方式1:在启动类添加,用 ctx.setAdditionalProfiles(“add”); 方法
springboot profiles,Spring Boot,spring boot,数据库,后端
方式2:在 application.yml 配置文件中添加,用 spring.profiles.include 属性
springboot profiles,Spring Boot,spring boot,数据库,后端
执行结果
application.yml 配置文件启动的profile 有 dev 和 add 两个开发环境,启动后使用的端口号是 add 的 8085
springboot profiles,Spring Boot,spring boot,数据库,后端

访问结果测试:

可以看出 当 application.yml 指定了 dev 和 add 两个开发环境后,只有 dev 和 add 两个controller 生效(生效:能访问到对应的被profile注解修饰的controller的方法),
但是开发环境是 add 覆盖了 dev 。
而test 开发环境 和 controller 都没生效。
springboot profiles,Spring Boot,spring boot,数据库,后端

★ 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 这个

springboot profiles,Spring Boot,spring boot,数据库,后端

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

springboot profiles,Spring Boot,spring boot,数据库,后端
可以看出来:
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为主。

springboot profiles,Spring Boot,spring boot,数据库,后端

★ 混合复合类型

混合复合类型,其实就是多个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 (添加)

springboot profiles,Spring Boot,spring boot,数据库,后端

定义这个属性处理类,作用是:拿对应的yml配置文件中的值
springboot profiles,Spring Boot,spring boot,数据库,后端
这个是控制器中的方法,通过访问,能更直观的看到数据
springboot profiles,Spring Boot,spring boot,数据库,后端

测试结果: List集合是完全覆盖,Map集合则是元素添加。springboot profiles,Spring Boot,spring boot,数据库,后端

★ 根据环境自动更新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 里面的数据注释掉
springboot profiles,Spring Boot,spring boot,数据库,后端
现在只指定了 dev ,所以也只有dev这个开发环境能生效。
访问测试:
测试结果发现跟自己预料的不一样。
如上面的图可以看到指定的是 dev 开发环境,然后dev 这个片段在9-30行,test在31-52行,启动项目后,发现第6行无论是指定dev还是test,最终加载的都是test这个开发环境,就像是test把dev覆盖了一样。
如图:按理说启动后端口应该是dev的8083

springboot profiles,Spring Boot,spring boot,数据库,后端文章来源地址https://www.toymoban.com/news/detail-787408.html

到了这里,关于22、springboot的Profile(通过yml配置文件配置 profile,快速切换项目的开发环境)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot多环境配置Maven Profile组

    Maven profile组 注意切换配置时   mvn clean下  或者 clean 加install 或者compile 编译 clean之后  install下 或者compile 编译 nohup java -Xms256m -Xmx512m -Dfile.encoding=UTF-8 -jar demo.jar --spring.profiles.active=prod system.log 21

    2024年02月02日
    浏览(39)
  • linux profile文件环境变量配置

    profile 文件位于/etc/目录下 /etc/profile , 当登入系统时候获得一个 shell 进程时,其读取环境profile 文件时候会读取,/etc/bash.bashrc,/etc/profile.d 文件下配置的sh文件,所以我们也可以在profile.d 和bash.bashrc 目录下创建sh文件,配置环境变量 profile,路径:/etc/profile,用于设置系统级

    2024年02月05日
    浏览(47)
  • mac 配置环境变量 .bash_profile文件

    打开.bash_profile文件 open -e ~/.bash_profile 编辑:增减自己的各软件配置 export M2_HOME=/Users/lizhen/apache-maven-3.5.4 export PATH=$PATH:$M2_HOME/bin PATH=$PATH:/usr/local/mysql/bin # JAVA JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-18.0.2.jdk/Contents/Home # Android SDK export ANDROID_HOME=/Users/lizhen/Library/Android/sdk export PATH

    2024年02月06日
    浏览(38)
  • 解析Spring Boot中的Profile:配置文件与代码的双重掌控

    基于 Spring Boot 创建 Web 应用程序的方法有很多,我们选择在idea中直接进行创建,服务器URL选择Spring Initializer 网站,类型选择Maven项目,java版本根据jdk版本进行选择。 然后添加相应依赖以及选择spring boot版本 接下来我们写一个Controller 现在我们需要对这个应用程序进行打包,使

    2024年02月09日
    浏览(42)
  • SpringBoot复习:(7)@Profile注解

    其中,student这个bean只有指定了profile才会装配,比如在application.properties中: @Profile注解不仅可以用在@Bean上,还可以用在注解类上,用在注解类时 只有设定了profile为指定的值,该配置类中的所有bean才会装配

    2024年02月15日
    浏览(35)
  • 【maven】通过profiles实现:怎样激活某个仓库、同时加载多个profile、不同环境加载不同依赖jar

    Maven中的profile是一组可选的配置,可以用来设置或者覆盖配置默认值。有了profile,你就可以为不同的环境定制构建。 profile可以在pom.xml中和maven的setting.xml文件中配置,如下: 在上述示例中,我们定义了一个名为\\\"nexus\\\"的profile,并在其中设置了一个名为\\\"my-repo\\\"的Maven仓库。该仓

    2024年02月13日
    浏览(40)
  • Linux 和 MacOS 中的 profile 文件详解(二)

    上篇文章讲解了 profile 文件的作用、login shell 和 non-login shell 的定义、不同 profile 被 bash shell 在不同情况下的加载顺序和作用,本文讲解一下 zsh shell 相关的知识。  MacOS 从 Catalina 版本开始将 zsh 作为默认登录 shell 和交互式 shell。 zsh 的配置文件加载顺序大致如下: /etc/zshen

    2024年02月13日
    浏览(29)
  • Linux 和 MacOS 中的 profile 文件详解(一)

    profile 文件是 Linux、MacOS 等(unix、类 unix 系统)系统中的一种配置文件,主要用于设置系统和用户的环境变量。 在 shell 中,可以通过执行 profile 文件来设置用户的环境变量。shell 有两种运行模式:login shell 和 non-login shell。 login shell 是指用户登录系统时启动的 shell,login sh

    2024年02月14日
    浏览(40)
  • Mac环境配置(Java)----使用bash_profile进行配置

    目录  一、下载Java 1、官方地址: 2、网盘下载地址(Java8): 二、Java环境配置(以Java8配置为例,所有版本配置方法一样) 1、打开软件--终端 2、首先查看本机Java的安装地址(系统默认的) 3、查看到Java8安装的路径如下:  4、如果是第一次配置环境变量,使用命令:【t

    2024年02月16日
    浏览(40)
  • Spring Profile与PropertyPlaceholderConfigurer实现项目多环境配置切换

    最近考虑项目在不同环境下配置的切换,使用profile注解搭配PropertyPlaceholderConfigurer实现对配置文件的切换,简单写了个demo记录下实现。 @Profile @Profile 通过对bean进行修饰,来限定spring在bean管理时的初始化情况,只有环境中激活的profile状态和修饰的value值对应时,该bean才会被

    2024年02月12日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包