Properties和yml区别
区别
文件格式
properties
- 基于键值对的格式,每一行都是一个键值对
 - 键和值之间用冒号分隔
 
示例:
server.port=8080
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=secret
yml
- 基于yml格式,使用缩进表示层次结构
 - 可读性较好,特别是对于层次结构的数据
 
示例:
server:
  port: 8080
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: root
    password: 12345
层次格式
properties:
- 不直接支持层次结构,需要通过点(.)分隔符来表示。
 
示例:
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=secret
yml:
- 天然支持层次结构,使用缩进来表示不同层级的数据。
 
示例:
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: root
    password: secret
可读性和可维护性
properties:
- 适合简单的键值对配置。
 - 当配置项较多且有层次结构时,可读性较差,维护较为不便。
 
yml:
- 可读性和可维护性较好,特别是对于复杂和层次结构的配置。
 - 通过缩进和结构化表示,配置项更直观。
 
注释支持
properties:
- 支持单行注释,使用 
#或!开头。 
示例:
# 注释
server.port=8080
yml:
- 支持单行注释,使用 
#开头 
示例:
# 注释
server:
  port: 8080
数组和列表支持
properties:
- 数组和列表的表示较为繁琐
 
示例:
spring.datasource.urls[0]=jdbc:mysql://localhost:3306/db1
spring.datasource.urls[1]=jdbc:mysql://localhost:3306/db2
yml:
- 自然支持数组和列表,表示方式简洁。
 
示例:
spring:
  datasource:
    urls:
      - jdbc:mysql://localhost:3306/db1
      - jdbc:mysql://localhost:3306/db2
文件大小和解析速度
properties:
- 文件通常较小,解析速度较快。
 - 适用于简单配置。
 
yml:
- 文件可能较大,特别是对于复杂配置。
 - 解析速度略慢,但一般不会成为性能瓶颈。
 
多环境支持
properties:
- 支持通过profile-specific properties文件(如
application-dev.properties)来实现多环境配置。 
示例:
application.properties
application-dev.properties
application-prod.properties
yml:
- 支持通过profile-specific yml文件(如
application-dev.yml)来实现多环境配置 
示例:
application.yml
application-dev.yml
application-prod.yml
引用和锚点
properties:
- 不支持引用和锚点
 
yml:
- 支持引用和锚点(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中,某些字符串如果不加引号,会被解析为其他类型的值。例如,开头为0或1的字符串可能被解析为整数。这会导致一些意外的行为或错误,特别是对于密码这样的敏感数据。
数字字符串解析问题: 具体来说就是:如果yml文件中的某个值看起来像数字(例如123或0123),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的字符串,以下情况也需要使用引号:
- 布尔值(true / false / yes / no)
 - null 值 (null / ~)
 - 日期(例如
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:
通过在
application.properties文件中指定激活的Profile:spring.profiles.active=dev或者在运行应用程序时通过命令行参数指定:
java -jar myapp.jar --spring.profiles.active=prod
yml文件
Profile-specific YAML 文件
基本配置文件
application.yml这是默认的配置文件,用于定义应用的基本配置。
server: port: 8080 spring: datasource: url: jdbc:mysql://localhost:3306/mydb username: root password: secret环境特定的配置文件
application-{profile}.yml通过使用特定环境的配置文件,可以覆盖基本配置文件中的某些配置。
application-dev.yml 用于开发环境:
server: port: 8081 spring: datasource: url: jdbc:mysql://localhost:3306/devdbapplication-prod.yml 用于生产环境:
server: port: 80 spring: datasource: url: jdbc:mysql://localhost:3306/proddb
激活特定的Profile
通过在
application.yml文件中指定激活的Profile:spring: profiles: active: dev或者在运行应用程序时通过命令行参数指定:
java -jar myapp.jar --spring.profiles.active=prod




