前段时间 Spring Boot 2.4.0 发布了,栈长作了一个新特性全盘解读,其中介绍了一个很重要的变革,那就是配置文件。

配置文件可是每个框架的核心,不得不搞清楚,所以,这篇栈长就带大家深入实战了解下 Spring Boot 2.4 配置文件都有哪些具体变更,以及如何迁移,已助你决定是否迁移到 Spring Boot 2.4。

概要

Spring Boot 2.4 改进了处理 application.properties 和 application.yml 配置文件的方式。更新后的逻辑旨在简化和合理化外部配置的加载方式,但有些参数的组合形式却得到了限制,升级请谨慎。

如果你的应用工程只有一个简单的 application.properties 或 application.yml 文件,则可以进行无缝升级到 Spring Boot 2.4.0。

但是,如果你的配置较为复杂,比如说有指定 profile 的参数,或者有基于 profile 激活的参数,要使用新功能就需要进行一些更改。

更多细节可参考:

https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-Config-Data-Migration-Guide

变更细节

1、YAML 配置排序变更

如果你在 application.yml 配置中启用了多套配置(即用 --- 分隔的多套配置),那就需要注意了,因为在 Spring Boot 2.4 中,配置参数是按在配置文件中定义的顺序先后进行加载的,因为在 Spring Boot 2.3 及之前的版本中,各个配置参数是基于 "profile" 的激活的顺序来加载的,后面激活加载的参数会覆盖之前的。

如果你有一些配置参数,它们之间又是互相覆盖,那就要确保所需要的参数要放在文件最后。

如在 Spring Boot 2.3 中:

spring:
profiles:
active:
- prod
- prodmq
- proddb ---
spring:
profiles: prod env: prod ---
spring:
profiles: proddb env: proddb ---
spring:
profiles: prodmq env: prodmq

Spring Boot 基础构建及 profile 基本介绍这里就不介绍了,关注公众号Java技术栈回复关键字 "boot",可以阅读我写的几十篇往期实战文章。

Spring Boot 教程和示例代码已上传到 Github:

https://github.com/javastacks/spring-boot-best-practice

回到上面的配置,如果同时启用多个 profile 的话,后面的会覆盖前面的,即 proddb 里面的配置参数会覆盖 prodmq 的,所以 env 的值为:proddb。

而如果升级到了 Spring Boot 2.4,env 的值则为:prodmq,因为按顺序加载的话 prodmq 中的 env 在配置文件中最下方。

所以,如果升级到 Spring Boot 2.4,就需要检查 "profile" 这些配置参数之间的关系,可能还需要对 YAML 中的配置重新排序。

2、Profile 配置覆盖变更

如果你使用了 JAR 外部化配置,并且也使用了基于 "profile" 的特定配置文件,那你就要检查下配置是否按预期加载了。

因为在之前的版本中,JAR 包外部的 application.properties 配置文件不会覆盖 JAR 包里面的基于 "profile" 的 application-xxxprofile.properties 配置文件。

从 Spring Boot 2.4 开始,外部化配置参数会覆盖内部的配置参数(不管是否基于 "profile" 激活),这个也是修复 Spring Boot 上的的一个 Issue:

https://github.com/spring-projects/spring-boot/issues/3845

这个问题的就是指 JAR 包外部的应用程序参数应优先于 JAR 包内部的特定激活的配置参数。

3、Profile 配置参数变更

如果你使用了 spring.profiles 属性指定了多套 YMAL 配置文件,现在需要使用新参数替代:

spring.config.activate.on-profile

配置示例:

---
spring.config.activate.on-profile: dev env: dev server:
port: 8080 ---
spring.config.activate.on-profile: test env: test server:
port: 8081 ---
spring.config.activate.on-profile: prod env: prod server:
port: 8082 ---
spring.config.activate.on-profile: proddb db:
name: mysql env: proddb ---
spring.config.activate.on-profile: prodmq mq:
address: localhost env: prodmq

和之前的逻辑一样,可以继续使用 spring.profiles.active 来激活特定的 profiles 列表,或者也可以使用表达式激活,如:prod & cloud,但是不能和 spring.config.activate.on-profile 结合使用。

另外,如果你之前使用了 spring.profiles.includespring.profiles 结合使用,就需要使用新的 "profile group" 特性了。

配置 profile group 组示例:

spring:
profiles:
active:
- prodall
group:
prodall:
- prod
- prodmq
- proddb

这样就定义了一个 "prodall" 组,包含了 prod, proddb, prodmq 三个 profile,同时在配置文件中直接使用 spring.profiles.active 来激活 "prodall" 组,这样就同时激活了 prod, proddb, prodmq。

4、回归传统模式

如果你想继续使用 Spring Boot 2.3 的配置文件逻辑,或者还没准备好迁移到 Spring Boot 2.4,也可以通过在 application.properties 或者 application.yml 配置文件中添加以下参数回到传统模式:

spring.config.use-legacy-processing = true

如果不指定这个参数为:true,那么在 Spring Boot 2.4 中就是默认新的配置文件处理逻辑。

总结

总结下来,个人感觉某些变更着实没什么卵用,但也不得不跟上它的节奏。

所以大家一定要注意了,迁移到 Spring Boot 2.4,需要注意文中的配置变更细节,一定要对所有变更内容做调整,不然参数加载会受到影响。

本节所有实战源代码示例已上传至 Github:

https://github.com/javastacks/spring-boot-best-practice

好了,今天的分享就到这里了,单看官方文档还不是很清楚,栈长也是对配置升级的细节做了各个实践才明白其中的奥妙,希望对大家有帮助。

欢迎大家 Star 关注,后续会不断更新。

学习更多 Spring Boot 教程,请关注公众号Java技术栈,后面栈长还会继续推送一些 Spring Boot 2.4 新特性实战文章。在公众号后台回复:boot,历史 Spring Boot 教程我也都整理好了。

最后,别忘了点在看、转发哦,需要你的鼓励~

版权申明:本文系公众号 "Java技术栈" 原创,原创实属不易,转载、引用本文内容请注明出处,禁止抄袭、洗稿,请自重,尊重他人劳动成果和知识产权。

近期热文推荐:

1.Java 15 正式发布, 14 个新特性,刷新你的认知!!

2.终于靠开源项目弄到 IntelliJ IDEA 激活码了,真香!

3.我用 Java 8 写了一段逻辑,同事直呼看不懂,你试试看。。

4.吊打 Tomcat ,Undertow 性能很炸!!

5.《Java开发手册(嵩山版)》最新发布,速速下载!

觉得不错,别忘了随手点赞+转发哦!

最新文章

  1. JAVA基础代码分享--学生成绩管理
  2. ci创建zip
  3. 能不能对metronic继续封装一下呢
  4. AWS学习之EC2
  5. canvas画时钟
  6. POJ 2109
  7. matlab2013a for linux/Ubuntu 安装步骤及创建快捷方式(ubuntu14.04下安装)
  8. javascript 字符串转为对像函数eval("string")
  9. Java并发编程之volatile变量
  10. 发布一个参考ssdb,使用go类似的实现redis高性能nosql:ledisdb
  11. (解决方法)Android studio 运行时报错Do you want to uninstall the existing application?的解决方法
  12. 面试总结之mysql
  13. EntityFramework Core进行读写分离最佳实践方式,了解一下(二)?
  14. 关于 iOS 性能优化方面的面试题,
  15. linux extglob模式 和rm反选
  16. HTML页面空格记录     (小计)
  17. 如何用命令将本地项目上传到git[z]
  18. jquery中遍历
  19. Docker:Docker machine(5)
  20. URAL - 1495 One-two, One-two 2

热门文章

  1. 10 XSRF和XSS
  2. mvc SelectList 给下拉框 @Html.DropDownList绑定值
  3. 为什么layui表单不显示?
  4. 记一次ns3的安装过程
  5. ClassNotFoundException: java.util.ArrayList$SubList 错误
  6. Python arange
  7. python学习手册.first
  8. WPF窗体中嵌入/使用WinForm类/控件(基于.NET Core)
  9. php include文件包含
  10. 如何使用Camtasia给视频或者图片调色