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/devdb
application-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