Spring Boot 2.4 配置文件将加载机制大变化

简介: Spring Boot 2.4 文件的加载方式进行重构

Spring Boot 2.4.0.M2 刚刚发布,它对 application.propertiesapplication.yml 文件的加载方式进行重构。如果应用程序仅使用单个 application.propertiesapplication.yml 作为配置文件,那么可能感受不到任何区别。但是如果您的应用程序使用更复杂的配置(例如,Spring Cloud 配置中心等),则需要来了解更改的内容以及原因。

为什么要进行这些更改

随着最新版本 Spring Boot 发布,Spring 一直在努力提升对 Kubernetes 的原生支持。在 Spring Boot 2.3 中,官方增加 Kubernetes Volume 的配置支持,但是未能实现。

Volume 配置挂载是 Kubernetes 的一项常用功能,其中 ConfigMap 指令用于直接在文件系统上显示配置。您可以装载包含多个键和值合并的完整 YAML 文件,也可以使用更简单的目录树格式,其中文件名是键,文件内容是值。

希望同时提供两者的支持,并且能够兼容我们现有的 application.propertiesapplication.yml 。为此需要修改 ConfigFileApplicationListener 类。

ConfigFileApplicationListener 问题

在 Spring Boot 中配置文件加载类 ConfigFileApplicationListener 属于比较核心的底层代码,每次维护都是非常的困难。并不是因为代码编写错误或者缺少相关单元测试,而是在添加新功能时,很难解决之前存在的问题。

即:

  • 配置文件非常灵活,可以在当前文件启用其他配置文件。
  • 文档加载顺序不固定。

以下面的例子来说:

security.user.password: usera
---
spring.profiles: local
security.user.password: userb
runlocal: true
---
spring.profiles: !dev
spring.profiles.include: local
security.user.password: userc

在这里,我们有一个 多文档 YAML文件(一个文件由三个逻辑文档组成,由 --- 分隔)。

如果使用 --spring.profile.actives=prod 运行,那么 security.user.password 的值是什么?是否设置 runlocal 属性?中间部分文档是否包括在内,因为配置文件在处理时没有激活?

我们经常会遇到关于这个文件处理逻辑的问题,但是每当试图修复它们时,最后带来各种各样的负面问题。

因此,在 Spring boot 2.4 中对 Properties 和 YAML 文件的加载方式进行两个重大更改:

  1. 文档将按定义的顺序加载。
  2. profiles 激活开关不能被配置在特定环境中。

文档排序

从 Spring Boot 2.4 开始,加载 Properties 和 YAML 文件时候会遵循, 在文档中声明排序靠前的属性将被靠后的属性覆盖

这点与 .properties 的排序规则相同。我们可以想一想,每次将一个 Value 放入 Map ,具有相同 key 的新值放入时,将替换已经存在的 Value。

同理对 Multi-document 的 YAML 文件,较低的排序也将被较高的覆盖:

test: "value"
---
test: "overridden-value"

Properties 文件支持多文档属性

在 Spring Boot 2.4 中, Properties 支持类似 YAML 多文档功能。多文档属性文件使用注释( # )后跟三个(---)破折号来分隔文档( 选择使用注释,以使现有的 IDE 正常支持 )。

例如,上面的 YAML 等效的 properties 为:

test=value
#---
test=overridden-value

特定环境激活配置

上述示例实际上没有任何意义,在我们开发过程中更为常见是声明某个属性仅在特定环境生效激活。

在 Spring Boot 2.3 中可以配置 spring.profiles 来实现。但在 Spring Boot 2.4 中 属性更改spring.config.activate.on-profile

例如,我们想要 test 属性仅仅在 dev Profile 激活时覆盖它,则可以使用以下配置:

test=value
#---
spring.config.activate.on-profile=dev
test=overridden-value

Profile Activation

使用 spring.profiles.active 属性在 application.propertiesapplication.yaml 文件的 根配置文件 来激 相关环境文件。

例如,下面这样:

test=value
spring.profiles.active=local
#---
spring.config.activate.on-profile=dev
test=overridden value

不允许的是将 spring.profiles.active 属性与 spring.config.activate.on-profile 一起使用。例如,以下文件将引发异常:

test=value
#---
spring.config.activate.on-profile=dev
spring.profiles.active=local # will fail
test=overridden value

通过这一新限制能使 application.propertiesapplication.yml 文件更加容易理解。使得 Spring Boot 本身更易于管理和维护。

Profile Groups

Profile Groups 是 Spring Boot 2.4 中的一项新功能,可让您将单个配置文件扩展为多个子配置文件。例如,假设有一组复杂的 @Configuration 类,可以使用 @Profile 注释有条件地启用它们。使用 @Profile("proddb") 开启数据库配置,使用 @Profile("prodmq") 开启消息配置等等。

使用多个配置文件可以使我们的代码更易于理解,但是对于部署而言并不是理想的选择。若用户需要同时激活 proddbprodmqprodmetrics 等。那么 Profile Groups 可让您做到这一点。

您可以在 application.propertiesapplication.yml 文件中定义 spring.profiles.group,那么开启 prod 则就相当于激活了此组的全部环境 。例如:

spring.profiles.group.prod=proddb,prodmq,prodmetrics

Importing 扩展 Configuration

现在,我们已经解决了配置文件处理的基本问题,我们终于能够考虑我们想要提供的新功能。我们使用 Spring Boot 2.4 提供的主要功能是支持导入其他配置。

对于早期版本的 Spring Boot,很难在 application.propertiesapplication.yml 之外导入其他 propertiesyaml 文件。可以使用 spring.config.additional-location 属性但它可以处理的文件类型非常有限。

在 Spring Boot 2.4 可以直接在 application.propertiesapplication.yml 文件中使用新的 spring.config.import 属性。例如希望导入一个 "忽略的 git" 的 developer.properties 文件,以便团队中的任何开发人员都可以快速更改属性:

application.name=myapp
spring.config.import=developer.properties

甚至可以将 spring.config.importspring.config.activate.on-profile 结合起来使用。例如,这里 prod.properties 仅在 prod 配置文件处于激活状态时加载:

spring.config.activate.on-profile=prod
spring.config.import=prod.properties

Import 可以被视为在声明它们的文档下方插入的其他文档。它们 遵循与常规多文档文件相同的自上而下的顺序:导入仅被导入一次,无论声明了多少次。

volume 挂载配置

导入定义使用与 URL 一样语法作为其值。如果您的位置没有前缀,则它被视为常规文件或文件夹。但是,如果您使用 configtree: 前缀,则告诉 Spring Boot,您将期望在该位置使用 Kubernetes volume 装载的配置树。

例如,您可以在 application.properties 配置:

spring.config.import=configtree:/etc/config

如果您有以下装载的内容:

etc/
 +- config/
     +- my/
     |  +- application
     +- test

将在 Spring Environment 中拥有 my.applicationtest 属性。 my.application 的值是 /etc/config/my/application 的内容, test 的值是 /etc/config/test 的内容。

根据云平台类型激活

如果只希望 Volume 挂载的配置(或该内容的任何属性)在特 定的云平台上 处于激活状态,可以使用 spring.config.activate.on-cloud-platform 属性。它的工作方式与 spring.config.activate.on-profile 类似,但它使用 CloudPlatform 的值,而不是配置文件名称。

如果我们想要在部署到 Kubernetes 时启用上述配置树,我们可以执行以下操作:

spring.config.activate.on-cloud-platform=kubernetes
spring.config.import=configtree:/etc/config

支持其他位置

spring.config.import 属性中指定的位置字符串是完全可插拔的,可以通过编写几个自定义类来扩展,第三方库将对自定义位置提供支持。例如,你能想到的第三方 jar 文件,例如 archaius://…vault://…zookeeper://…

如果您有兴趣添加其他位置支持,请查看 org.springframework.boot.context.configConfigDataLocationResolverConfigDataLoader 的 javadoc。

版本回滚

正如上文所描述的,Spring Boot 针对配置文件的功能变更是非常大的。考虑到低版本的兼容性

可以设置 spring.config.use-legacy-processing=true 属性即可,恢复到之前版本的文件处理机制。

如果发现关于此处的问题,则需要切换到旧版处理,请 在 GitHub 上提出问题,官方将尝试解决该问题。

总结

官方希望新的配置数据处理更加好用,并且不会引起太多升级麻烦。如果您想了解更多有关它们的信息,可以查阅更新的

欢迎关注我,后续会通过代码来详细说明此处变更。

翻译: 冷冷、如梦技术

原文链接:https://spring.io/blog/2020/08/14/config-file-processing-in-spring-boot-2-4

项目推荐: Spring Cloud 、Spring Security OAuth2的RBAC权限管理系统 欢迎关注
相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
6月前
|
人工智能 JSON 安全
Spring Boot实现无感刷新Token机制
本文深入解析在Spring Boot项目中实现JWT无感刷新Token的机制,涵盖双Token策略、Refresh Token安全性及具体示例代码,帮助开发者提升用户体验与系统安全性。
613 4
|
2月前
|
JavaScript Java Maven
【SpringBoot(二)】带你认识Yaml配置文件类型、SpringMVC的资源访问路径 和 静态资源配置的原理!
SpringBoot专栏第二章,从本章开始正式进入SpringBoot的WEB阶段开发,本章先带你认识yaml配置文件和资源的路径配置原理,以方便在后面的文章中打下基础
311 3
|
9月前
|
存储 Java 文件存储
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— logback.xml 配置文件解析
本文解析了 `logback.xml` 配置文件的详细内容,包括日志输出格式、存储路径、控制台输出及日志级别等关键配置。通过定义 `LOG_PATTERN` 和 `FILE_PATH`,设置日志格式与存储路径;利用 `<appender>` 节点配置控制台和文件输出,支持日志滚动策略(如文件大小限制和保存时长);最后通过 `<logger>` 和 `<root>` 定义日志级别与输出方式。此配置适用于精细化管理日志输出,满足不同场景需求。
2154 1
|
5月前
|
JSON 前端开发 Java
Spring MVC 核心组件与请求处理机制详解
本文解析了 Spring MVC 的核心组件及请求流程,核心组件包括 DispatcherServlet(中央调度)、HandlerMapping(URL 匹配处理器)、HandlerAdapter(执行处理器)、Handler(业务方法)、ViewResolver(视图解析),其中仅 Handler 需开发者实现。 详细描述了请求执行的 7 步流程:请求到达 DispatcherServlet 后,经映射器、适配器找到并执行处理器,再通过视图解析器渲染视图(前后端分离下视图解析可省略)。 介绍了拦截器的使用(实现 HandlerInterceptor 接口 + 配置类)及与过滤器的区别
431 0
|
11月前
|
XML Java 应用服务中间件
Spring Boot 两种部署到服务器的方式
本文介绍了Spring Boot项目的两种部署方式:jar包和war包。Jar包方式使用内置Tomcat,只需配置JDK 1.8及以上环境,通过`nohup java -jar`命令后台运行,并开放服务器端口即可访问。War包则需将项目打包后放入外部Tomcat的webapps目录,修改启动类继承`SpringBootServletInitializer`并调整pom.xml中的打包类型为war,最后启动Tomcat访问应用。两者各有优劣,jar包更简单便捷,而war包适合传统部署场景。需要注意的是,war包部署时,内置Tomcat的端口配置不会生效。
2645 17
Spring Boot 两种部署到服务器的方式
|
10月前
|
XML Java Maven
Spring 手动实现Spring底层机制
Spring 第六节 手动实现Spring底层机制 万字详解!
419 31
|
9月前
|
Java 数据库 微服务
微服务——SpringBoot使用归纳——Spring Boot中的项目属性配置——指定项目配置文件
在实际项目中,开发环境和生产环境的配置往往不同。为简化配置切换,可通过创建 `application-dev.yml` 和 `application-pro.yml` 分别管理开发与生产环境配置,如设置不同端口(8001/8002)。在 `application.yml` 中使用 `spring.profiles.active` 指定加载的配置文件,实现环境快速切换。本节还介绍了通过配置类读取参数的方法,适用于微服务场景,提升代码可维护性。课程源码可从 [Gitee](https://gitee.com/eson15/springboot_study) 下载。
362 0
|
11月前
|
Java 测试技术 应用服务中间件
Spring Boot 配置文件总结
Spring Boot 提供全局配置文件 `application.properties` 和 `application.yml`,用于修改自动配置的默认值。前者使用键值对配置,后者使用缩进和冒号。不同环境(开发、测试、生产)可切换配置文件,通过 `spring.profiles.active` 指定。例如,开发环境端口为4790,测试环境为4791,生产环境为4792。配置示例展示了属性、List、Map定义及引用方法。
362 14
|
12月前
|
XML Java 数据格式
使用idea中的Live Templates自定义自动生成Spring所需的XML配置文件格式
本文介绍了在使用Spring框架时,如何通过创建`applicationContext.xml`配置文件来管理对象。首先,在resources目录下新建XML配置文件,并通过IDEA自动生成部分配置。为完善配置,特别是添加AOP支持,可以通过IDEA的Live Templates功能自定义XML模板。具体步骤包括:连续按两次Shift搜索Live Templates,配置模板内容,输入特定前缀(如spring)并按Tab键即可快速生成完整的Spring配置文件。这样可以大大提高开发效率,减少重复工作。
使用idea中的Live Templates自定义自动生成Spring所需的XML配置文件格式
|
12月前
|
NoSQL Java Redis
Spring Boot 自动配置机制:从原理到自定义
Spring Boot 的自动配置机制通过 `spring.factories` 文件和 `@EnableAutoConfiguration` 注解,根据类路径中的依赖和条件注解自动配置所需的 Bean,大大简化了开发过程。本文深入探讨了自动配置的原理、条件化配置、自定义自动配置以及实际应用案例,帮助开发者更好地理解和利用这一强大特性。
1911 15