如果你使用Spring Boot 2.4及以上版本,你会发现Spring Boot中对多环境支持的配置项spring.profiles.active已经被废弃。而Spring Boot也一直在逐步推新的配置方式,可能很多人还不知道,本文就带大家一探究竟。

Spring Boot的多环境配置

在学习新的配置方式之前,先回顾一下通常的多环境配置形式。在项目中我们经常会遇到一个项目部署到多个环境,比如开发环境、测试环境、生产环境。而不同的环境又有不同的配置文件。因此,Spring Boot提供了基于spring.profiles.active配置项的方式,来方便的指定使用对应环境的配置文件。

按照Spring Boot的约定,首先要定义一个主配置文件application.yml(或.properties)文件,然后其他环境的配置文件按照application-{profile}.properties的格式进行配置。其中{profile}为对应环境标识,比如通常:application-dev.yml为开发环境、application-test.yml为测试环境、application-prod.yml为生产环境。

在application.yml中可以对spring.profiles.active进行配置,指定当前使用哪个环境:

server:
  port: 8080

spring:
  profiles:
    active: dev

在启动SpringBoot项目时,也可以通过参数指定一到多个配置文件:

-Dspring.profiles.active=dev,master

这样通过参数的变换一个jar包就可以运用在不同的环境下,也不用频繁的打包了。上述方式是我们最常见的一种了。

单个文件配置

如果嫌多个配置文件比较麻烦,Spring Boot对Profiles的配置也支持在application.yml中为每个环境进行配置。

server:
  port: 8080

spring:
  profiles:
    active: test
---
spring:
  profiles: test

server:
  port: 9090
---
spring:
  profiles: prod

server:
  port: 9090

分隔符“—”之前的配置是默认配置,不需要指定Profile,后续每段配置都必须以spring.profiles: xxx开头,表示一个Profile。整体而言,达到的效果与多配置文件的效果一样。可查看启动日志中打印出的active信息:

The following profiles are active: test

启动时指定使用哪个配置文件的方式与第一种方式相同。

新的使用形式

无论你使用了上述的哪种形式,在使用Spring Boot 2.4以上版本时,关于spring.profiles.active配置项都被划上一道线,也就是说被废弃了。当然,虽然被弃用了,如果非要使用,还是可以正常使用的,但作为一个有志向的程序员,有那么一道删除线,看起来还是感觉不舒服的。既然基础知识准备完毕,那么就来看看Spring Boot支持的最新配置方式spring.config.activate.on-profile。

Spring Boot之所以进行大范围的改动,最主要的动机有两个,一个是对Kubernetes的兼容支持,一个是修复因ConfigFileApplicationListener类导致的文件处理问题。因此,在文件的加载方式上发生了两个重大变化:文档将按定义的顺序加载、profiles激活开关不能被配置在特定环境中。

基于spring.config.activate.on-profile对上面的配置进行改造,使用示例如下:

server:
  port: 8080

spring:
  profiles:
    active: test
---
spring:
  config:
    activate:
      on-profile: dev

server:
  port: 9090
---
spring:
  config:
    activate:
      on-profile: prod

server:
  port: 9090

也就是说,在具体的环境(test、prod等)配置中将spring.profiles或spring.profiles.active配置替换为了spring.config.activate.on-profile。而激活配置spring.profiles.active的使用并未改变。启动应用时,指定加载不同环境配置方式不变,依然采用spring.profiles.active指定。

如果要设置默认的的配置环境,依旧是在公共部分通过spring.profiles.active来指定。

其他注意事项

在使用新的配置方式时还是有很多注意事项的,避免踩坑。

YAML配置排序变更

Spring Boot 2.4中,配置参数是按在配置文件中定义的先后顺序进行加载的,后激活加载的参数会覆盖前面的。如果有一些配置参数之间是互相覆盖,那就要确保所需要的参数要放在文件最后。

Profile配置覆盖变更

之前版本中,JAR 包外的application.properties配置文件不会覆盖jar包里面的基于 “profile” 的 application-xxxprofile.properties 配置文件。Spring Boot 2.4版本,外部化配置参数会覆盖内部的配置参数(不管是否基于”profile”激活)。

回归传统模式

如果当前项目的配置文件暂时不适合或不方便升级为新的模式,则可以通过配置指定为之前的处理逻辑。通过如下参数进行配置:

spring.config.use-legacy-processing = true

但这种方式不太建议长期使用,毕竟技术的发展趋势已经定调了,在未来某一天说不定老的模式就被废弃了。

小结

针对这次配置文件的升级还是比较重大的,如果非必须请谨慎升级。在查看资料时发现2.4.0以上不同的版本还有不同的坑,特别是覆盖的问题,贸然升级可能会导致系统不配置文件不可用等情况。



SpringBoot多环境配置,旧的已过时,新的有人还不知道插图

关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台

除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接

本文链接:http://www.choupangxia.com/2021/04/08/springboot-profile-2/