Spring YAML与属性文件配置文件对比 | Baeldung


YAML是用于配置文件的人性化表示法。为什么相比Spring Boot中的属性文件Properties,我们更喜欢这种数据序列化?除了可读性和减少重复之外,YAML是在部署时Configuration as Code(配置即编程)的理想语言。
12因子身份验证器建议的那样,将YAML用于Spring DevOps有助于在环境中存储配置变量。
在本教程中,我们将比较Spring YAML和属性文件,以检查使用它们之间的主要优点。但是请记住,选择YAML而非属性文件配置有时是个人喜好的决定。

YAML代表“ YAML Ain't Markup Language” 的递归首字母缩写。它具有以下特征:

  • 更清晰,更人性化
  • 非常适合分层配置数据
  • 它支持增强功能,例如地图,列表和标量类型

这些功能使YAML成为Spring配置文件的完美伴侣。在这里,对于那些以YAML开头的人来说要小心一点:由于其缩进规则,一开始编写它可能有点乏味。
让我们看看它是如何工作的!

YAML是一种用于配置文件的特殊数据格式。它更具可读性,并且在属性文件上提供了增强的功能。因此,在属性文件配置上推荐这种表示法是有意义的。此外,从1.2版开始,YAML是JSON的超集。
Spring配置文件允许分离环境并对其应用不同的属性。YAML增加了在同一文件中包含多个配置文件的可能性。
在我们的案例中,出于部署目的,我们将有三个:测试test,开发dev和生产prod:

spring:
  profiles:
    active:
    - test
 
---
 
spring:
  profiles: test
name: test-YAML
environment: testing
servers:
  - www.abc.test.com
  - www.xyz.test.com
   
---
 
spring:
  profiles: prod
name: prod-YAML
environment: production
servers:
  - www.abc.com
  - www.xyz.com
     
---
 
spring:
    profiles: dev
name: ${DEV_NAME:dev-YAML}
environment: development
servers:
    - www.abc.dev.com
    - www.xyz.dev.com

现在让我们检查spring.profiles.active属性,该属性默认情况下分配测试环境。我们可以使用不同的配置文件重新部署工件,而无需再次构建源代码。
Spring的另一个有趣功能是您可以通过环境变量启用配置文件

export SPRING_PROFILES_ACTIVE=dev

可以配置YAML属性,直接从环境中分配值:

name: ${DEV_NAME:dev-YAML}

我们可以看到,如果未配置任何环境变量,则使用默认值test-YAML。

YAML的层次结构提供了减少配置属性文件高层的方法。我们来看一个例子的区别:

component:
  idm:
    url: myurl
    user: user
    password: password
    description: >
      this should be a long
      description
  service:
    url: myurlservice
    token: token
    description: >
      this should be another long
      description

使用属性文件,相同的配置将变得多余:

component.idm.url=myurl
component.idm.user=user
component.idm.password=password
component.idm.description=this should be a long \
                          description
component.service.url=myurlservice
component.service.token=token
component.service.description=this should be another long
                              description

YAML的层次性极大地提高了可读性。这不仅是避免重复的问题,而且是很好使用的缩进,它完美地描述了配置的含义和用途。

我们可以使用YAML属性文件配置列表,有两种方法可以分配值并将它们存储在列表中:

servers:
  - www.abc.test.com
  - www.xyz.test.com
   
external: [www.abc.test.com, www.xyz.test.com]

两个示例提供了相同的结果。使用属性文件进行的等效配置将更难以阅读:

servers[0]=www.abc.test.com
servers[1]=www.xyz.test.com
 
external=www.abc.test.com, www.xyz.test.com

同样,YAML版本更加易于阅读和清晰。
同样,我们可以配置map:

map:
  firstkey: key1
  secondkey: key2