如果你使用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以上不同的版本还有不同的坑,特别是覆盖的问题,贸然升级可能会导致系统不配置文件不可用等情况。