区别

文件格式

properties

  1. 基于键值对的格式,每一行都是一个键值对
  2. 键和值之间用冒号分隔

示例:

server.port=8080
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=secret

yml

  1. 基于yml格式,使用缩进表示层次结构
  2. 可读性较好,特别是对于层次结构的数据

示例:

server:
  port: 8080

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: root
    password: 12345

层次格式

properties:

  1. 不直接支持层次结构,需要通过点(.)分隔符来表示。

示例:

spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=secret

yml:

  1. 天然支持层次结构,使用缩进来表示不同层级的数据。

示例:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: root
    password: secret

可读性和可维护性

properties:

  1. 适合简单的键值对配置。
  2. 当配置项较多且有层次结构时,可读性较差,维护较为不便。

yml:

  1. 可读性和可维护性较好,特别是对于复杂和层次结构的配置。
  2. 通过缩进和结构化表示,配置项更直观。

注释支持

properties:

  1. 支持单行注释,使用 #! 开头。

示例:

# 注释
server.port=8080

yml:

  1. 支持单行注释,使用 # 开头

示例:

# 注释
server:
  port: 8080

数组和列表支持

properties:

  1. 数组和列表的表示较为繁琐

示例:

spring.datasource.urls[0]=jdbc:mysql://localhost:3306/db1
spring.datasource.urls[1]=jdbc:mysql://localhost:3306/db2

yml:

  1. 自然支持数组和列表,表示方式简洁。

示例:

spring:
  datasource:
    urls:
      - jdbc:mysql://localhost:3306/db1
      - jdbc:mysql://localhost:3306/db2

文件大小和解析速度

properties:

  1. 文件通常较小,解析速度较快。
  2. 适用于简单配置。

yml:

  1. 文件可能较大,特别是对于复杂配置。
  2. 解析速度略慢,但一般不会成为性能瓶颈。

多环境支持

properties:

  1. 支持通过profile-specific properties文件(如application-dev.properties)来实现多环境配置。

示例:

application.properties
application-dev.properties
application-prod.properties

yml:

  1. 支持通过profile-specific yml文件(如application-dev.yml)来实现多环境配置

示例:

application.yml
application-dev.yml
application-prod.yml

引用和锚点

properties:

  1. 不支持引用和锚点

yml:

  1. 支持引用和锚点(YAML锚点),可以减少重复配置。

示例:

default: &default
  datasource:
    username: root
    password: secret

development:
  <<: *default
  datasource:
    url: jdbc:mysql://localhost:3306/devdb

production:
  <<: *default
  datasource:
    url: jdbc:mysql://localhost:3306/proddb

注意

在yml中,某些字符串如果不加引号,会被解析为其他类型的值。例如,开头为01的字符串可能被解析为整数。这会导致一些意外的行为或错误,特别是对于密码这样的敏感数据。

数字字符串解析问题: 具体来说就是:如果yml文件中的某个值看起来像数字(例如1230123),YAML解析器会将其解释为数字类型。这意味着字符串0123会被解析为整数123,这显然不是我们想要的,尤其是当我们处理的是密码。为了解决这个问题,可以将这些值用双引号括起来,以确保它们被正确解析为字符串类型。(所以在spring.datasource.password 这里如果开头是0/1必须要加双引号)

示例:

spring:
  datasource:
    username: root
    password: 012345  # 这个值会被解析为整数 12345

正确的yml配置:

spring:
  datasource:
    username: root
    password: "012345"  # 这个值会被正确解析为字符串 "012345"

其他需要注意的情况:

除了开头为0或1的字符串,以下情况也需要使用引号:

  1. 布尔值(true / false / yes / no)
  2. null 值 (null / ~)
  3. 日期(例如2024-06-09

示例:

example:
  bool: true         # 被解析为布尔值 true
  date: 2023-06-01   # 被解析为日期
  string1: "true"    # 被解析为字符串 "true"
  string2: "2023-06-01"  # 被解析为字符串 "2023-06-01"

多环境配置

properties文件

Profile-specific Properties 文件

  • 基本配置文件 application.properties

    这是默认的配置文件,用于定义应用的基本配置。

    示例:

    server.port=8080
    spring.datasource.url=jdbc:mysql://localhost:3306/mydb
    spring.datasource.username=root
    spring.datasource.password=secret
  • 环境特定的配置文件 application-{profile}.properties

    通过使用特定环境的配置文件,可以覆盖基本配置文件中的某些配置。

application-dev.properties 用于开发环境:

server.port=8081
spring.datasource.url=jdbc:mysql://localhost:3306/devdb

application-prod.properties 用于生产环境:

server.port=80
spring.datasource.url=jdbc:mysql://localhost:3306/proddb

激活特定的Profile:

  1. 通过在application.properties文件中指定激活的Profile:

    spring.profiles.active=dev
  2. 或者在运行应用程序时通过命令行参数指定:

    java -jar myapp.jar --spring.profiles.active=prod

yml文件

Profile-specific YAML 文件

  1. 基本配置文件 application.yml

    这是默认的配置文件,用于定义应用的基本配置。

    server:
      port: 8080
    
    spring:
      datasource:
        url: jdbc:mysql://localhost:3306/mydb
        username: root
        password: secret
  2. 环境特定的配置文件 application-{profile}.yml

    通过使用特定环境的配置文件,可以覆盖基本配置文件中的某些配置。

    application-dev.yml 用于开发环境:

    server:
      port: 8081
    
    spring:
      datasource:
        url: jdbc:mysql://localhost:3306/devdb
    

    application-prod.yml 用于生产环境:

    server:
      port: 80
    
    spring:
      datasource:
        url: jdbc:mysql://localhost:3306/proddb

激活特定的Profile

  1. 通过在application.yml文件中指定激活的Profile:

    spring:
      profiles:
        active: dev
  2. 或者在运行应用程序时通过命令行参数指定:

    java -jar myapp.jar --spring.profiles.active=prod