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

简介: SpringBoot多环境配置,旧的已过时,新的有人还不知道

如果你使用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

1

这样通过参数的变换一个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

1

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


新的使用形式

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


目录
相关文章
|
Nacos
Nacos启动报错解决:which: no javac in (/usr/local/sbin:/usr/local/bin:/
Nacos启动报错解决:which: no javac in (/usr/local/sbin:/usr/local/bin:/
1609 0
|
12月前
|
JSON 安全 算法
|
Java 应用服务中间件 Maven
SpringBoot概述&SpringBoot基础配置&yml的使用&多环境启动
SpringBoot概述&SpringBoot基础配置&yml的使用&多环境启动
662 2
|
弹性计算 编解码 大数据
小鹏汽车核心业务迁移至阿里云倚天实例,节省20%算力成本
9月20日,在2024云栖大会上,小鹏汽车宣布车联网、官网、商城、大数据等核心业务已迁移至阿里云倚天实例,节省了超过20%的算力成本。
422 14
【Layui】Layui下select下拉框不显示或没有效果
【Layui】Layui下select下拉框不显示或没有效果
|
NoSQL Java Redis
Redis 从入门到精通之Redis操作测试指定key是否存在
在Redis中,可以使用`EXISTS`命令来测试指定的key是否存在。 `EXISTS`命令的基本语法如下: ``` EXISTS key ``` 其中,`key`是要测试的key的名称。如果指定的key存在,命令返回1;如果指定的key不存在,命令返回0。jedis.exists("foo");RedisTemplate的操作,包括测试指定key是否存在。使用该类可以方便地进行Redis操作,而无需关注底层细节。`exists`方法使用`hasKey`方法测试指定key是否存在,如果存在,则返回true;如果不存在,则返回false。
1636 105
【idea中Activiti BPMN visualizer插件和Camunda Modeler工作流设计器的简单使用】
【idea中Activiti BPMN visualizer插件和Camunda Modeler工作流设计器的简单使用】
3507 0
|
Ubuntu Java Linux
Pcap4J抓包
学习使用pacp4j
1058 0
|
Java 数据安全/隐私保护
SpringBoot使用jasypt进行配置文件加密
SpringBoot使用jasypt进行配置文件加密
944 1