SpringBoot学习(properties、yml(主流)、yaml格式配置文件)(读取yml配置文件的3种方式)(详解)
目录
一、SpringBoot配置文件详解。
1.1配置文件简介。
1.2配置文件分类。(3种配置文件格式)
<1>application.properties(properties格式)。
<2>application.yml(yml格式)。
<3>application.yaml(yaml格式)。
1.3三种格式配置文件的优先级。
1.4yml文件。
<1>具体语法格式要求。
<2>常见数据的书写格式。
<3>普通数组书写格式。
<4>对象数组书写格式。
1.5读取yml文件中的数据。
<1>读取单一数据。(@Value)
<2>读取全部数据。(Environment对象)
<3>读取自定义对象数据。
1.6yaml文件中的数据引用。
1.7yaml配置随机值。
1.8多环境开发。(重点)
<1>yaml 单文件版。
<2>yaml 多文件版。
<3>properties 多文件版。
一、SpringBoot配置文件详解。
1.1配置文件简介。
- 覆盖SpringBoot工程的默认配置,并修改成自己所设定的配置文件。
- 配置文件中具体能够配置什么内容?ApplicationProperties官网链接附上:Common Application Properties :: Spring Boot
1.2配置文件分类。(3种配置文件格式)
- 就以简单配置修改Tomcat默认启动端口号(8080)为例。
- 注意:yml 和 yaml 这两种文件扩展名本质上并无区别。它们都用于表示 YAML(YAML Ain't Markup Language)格式的文件。
<1>application.properties(properties格式)。
server.port=8090
<2>application.yml(yml格式)。
server:port: 9090
<3>application.yaml(yaml格式)。
server:port: 9091
1.3三种格式配置文件的优先级。
- 优先级:application.properties > application.yml > application.yaml。
- 注意:每个配置文件中的项都会生效。只不过如果多个配置文件中有相同类型的配置时:优先级高的文件覆盖优先级的文件中的配置。如果配置项不同的话,所有的配置项都会生效。
- 测试如下。
- application.properties配置文件。
- application.yml配置文件。
- application.yaml配置文件。
1.4yml文件。
- SpringBoot配置文件主流格式:yml结尾的配置文件格式。并且在书写该类配置文件时可以通过提示的形式加载正确的格式。
- YAML(YAML Ain't Markup Language),一种数据序列化格式。具有容易阅读、容易与脚本语言交互、以数据为核心,重数据轻格式的特点。常见的文件扩展名有两种:yml格式(主流)、yaml格式。
<1>具体语法格式要求。
大小写敏感。
属性层级关系使用多行描述,每行结尾使用冒号结束。
使用缩进表示层级关系,同层级左侧对齐。
属性值前面必须添加空格。(属性名与属性值之间使用“冒号+空格”作为分隔)
“#”表示注释。
<2>常见数据的书写格式。
- 布尔值在 YAML 里不区分大小写,TRUE、true、True、FALSE、false、False 都能被正确解析为布尔类型。
is_active1: TRUE is_active2: false
- 浮点数支持常规的小数表示形式,也支持科学计数法。
float1: 3.14 float2: 6.8523015e+5
- 整数支持十进制、二进制、八进制和十六进制的表示方式。要注意的是,二进制数以 0b 开头,八进制数以 0o 开头,十六进制数以 0x 开头。
int_decimal: 123 # 代表十进制整数123 int_binary: 0b1010_0111_0100_1010_1110 # 代表二进制整数,0b表示这是二进制数,十进制数是43498 int_octal: 0o755 # 代表八进制整数,0o表示这是八进制数,十进制数是493 int_hexadecimal: 0xFF # 代表十六进制整数,0x表示这是十六进制数,十进制数是255
- 在 YAML 中,通常用 ~ 来表示空值,也可以使用 null 关键字。
empty_value1: ~ empty_value2: null
- 字符串可以直接书写。若包含特殊字符,就需要用单引号或者双引号包裹。双引号支持转义字符,单引号则不支持。
string1: HelloWorld # 这是一个直接书写的字符串,没有使用引号包裹,适用于字符串中不包含特殊字符(如空格、特殊标点等)的情况,该字符串的值为"HelloWorld"。string2: "Hello World" # 使用双引号包裹的字符串,可用于包含空格等特殊字符的情况。双引号内的特殊字符会被正常解析,这里字符串的值为"Hello World"。string3: 'It''s a nice day.' # 这是一个使用单引号包裹的字符串。单引号内的字符会按字面意思解析,不会进行转义。为了表示单引号字符,需要使用两个连续的单引号('')来表示一个单引号,该字符串的值为"It's a nice day."。string4: "It's a \"nice\" day." # 这是一个使用双引号包裹的字符串。双引号内支持转义字符,这里使用反斜杠(\)对单引号(')和双引号(")进行转义,使得它们能作为普通字符存在于字符串中,该字符串的值为"It's a \"nice\" day."。
- 日期必须要使用 yyyy-MM-dd 格式。
date: 2018-02-17
- 日期和时间之间用 T 连接,时区用 + 或者 - 表示。
datetime: 2018-02-17T15:02:31+08:00#2018-02-17:表示日期,即 2018 年 2 月 17 日。 #T:是日期和时间之间的分隔符,是 ISO 8601 标准中规定的表示方法。 #15:02:31:表示时间,即下午 3 点 2 分 31 秒。 #+08:00:表示时区,这里是东八区。说明这个时间是基于东八区的时间,也就是北京时间。
<3>普通数组书写格式。
- 在 YAML 里,普通数组可在属性名下方用减号(-)作为数据起始符号,每个数据占一行,减号与数据之间用空格分隔。
subject:- java- mysql- spring
- 除了标准格式,YAML 还支持使用方括号
[]
来表示数组的缩略格式,元素之间用逗号分隔。student:name: 张三age: 18subject:- Java- mysql- spring# 数组书写缩略格式loves: [男,女]
<4>对象数组书写格式。
- 格式一:对象数组可以通过在属性名下方,每个对象使用减号开头,对象的属性以键值对形式缩进书写来表示。
- users是一个对象数组属性,包含两个对象。每个对象有 name 和 age 两个属性,通过缩进明确表示对象的层级关系。这种格式直观地展示了每个对象的结构,易于理解。
# 对象数组格式一 users:- name: Tomage: 4- name: Jerryage: 5
- 另一种对象数组的表示方式是每个对象以减号开始单独占一行,对象的属性在减号下缩进书写。
# 对象数组格式二 users1:-name: Tomage: 4-name: Jerryage: 5
- 对象数组支持缩略格式。将所有对象用方括号括起来,每个对象也用大括号括起,对象内属性以键值对形式书写,属性间用逗号分隔。
# 对象数组缩略格式 users2: [ { name:Tom , age:4 } , { name:Jerry , age:5 } ]
1.5读取yml文件中的数据。
- yml配置文件模拟数据。
jdbc:driverClassName: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/hylusername: rootpassword: 123456testArray:- jdbc1- jdbc2
- 依赖项。
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- optional 设置为 true 表示该依赖是可选的,不会传递到依赖项目中,避免冲突 --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency>
<1>读取单一数据。(@Value)
- 使用@Value注解时,必须将其写在被 Spring 管控的 bean 的属性名上方。这样在 bean 初始化过程中,才能成功读取yaml配置文件里对应的单一数据 。
package com.hyl.pojo;import lombok.Data; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component;@Component @Data public class Jdbc {@Value("${jdbc.driverClassName}")private String driverClassName;@Value("${jdbc.url}")private String url;@Value("${jdbc.username}")private String username;@Value("${jdbc.password}")private String password;@Value("${jdbc.testArray[0]}")private String arr1;@Value("${jdbc.testArray[1]}")private String arr2; }
package com.hyl;import com.hyl.pojo.Jdbc; import jakarta.annotation.Resource; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest public class JdbcTest {@Resourceprivate Jdbc jdbc;@Testpublic void testJdbc(){System.out.println(jdbc);} }
<2>读取全部数据。(Environment对象)
- 当数据量较大时,逐一读取数据较为繁琐。
- Spring Boot 提供 Environment 对象,可借助自动装配注解 @Resource 将 yaml 文件中的所有数据封装其中。获取属性时,通过 Environment 的 getProperty("?") 方法,传入属性名即可
package com.hyl;import jakarta.annotation.Resource; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.core.env.Environment;@SpringBootTest public class JdbcTest02 {@Resourceprivate Environment environment;@Testpublic void test(){System.out.println(environment.getProperty("jdbc.driverClassName"));System.out.println(environment.getProperty("jdbc.url"));System.out.println(environment.getProperty("jdbc.username"));System.out.println(environment.getProperty("jdbc.password"));System.out.println(environment.getProperty("jdbc.testArray[0]"));System.out.println(environment.getProperty("jdbc.testArray[1]"));} }
<3>读取自定义对象数据。
- 单一数据读取繁琐,全数据读取使用不便。
- 而 Java 面向对象,常将一组数据封装为对象。Spring Boot 支持将 yaml 对象数据封装为 Java 对象 。
- 具体操作是定义一个类。1、通过@Component使其成为 Spring 管理的 bean。2、用@ConfigurationProperties(prefix = "xxx")指定加载 yaml 中对应前缀的配置信息。
package com.hyl.pojo;import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component;@Data @Component @ConfigurationProperties(prefix = "jdbc") public class Jdbc02 {private String driverClassName;private String url;private String username;private String password;private String[] testArray; }
package com.hyl;import com.hyl.pojo.Jdbc02; import jakarta.annotation.Resource; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest public class JdbcTest04 {@Resourceprivate Jdbc02 jdbc02;@Testpublic void test(){System.out.println(jdbc02);} }
1.6yaml文件中的数据引用。
- yaml 文件中数据引用的方法。当存在多个具有相同前缀的数据时,可定义变量,通过${变量名}的格式引用变量,避免重复书写。
# 定义基础目录变量 baseDir: /home/user/app # 定义不同用途的目录,通过引用baseDir变量来设置路径 dirs:dataDir: ${baseDir}/datalogDir: ${baseDir}/logstmpDir: ${baseDir}/temp
- 书写含转义字符的字符串时,需用双引号包裹。
filePath: "C:\\Users\\userName\\Documents\\file.txt" menuPath: "system\\user\\settings"
1.7yaml配置随机值。
- 在 Spring Boot 属性配置文件中,可利用 ${random} 语法来生成随机值。
- 支持生成 int 值、long 值、String 字符串等。通过不同后缀或参数限定,能获取特定范围或类型的随机值。
randomVals:# 生成随机字符串randomStr: ${random.value} # 生成随机int值randomInt: ${random.int} # 生成随机long值randomLong: ${random.long} # 生成0 - 9范围内的随机int值randomIntRange1: ${random.int(10)} # 生成12 - 65范围内的随机int值randomIntRange2: ${random.int[12,65]}
1.8多环境开发。(重点)
- 自己电脑上写的Java程序最终要放到别人的服务器上去运行。但每个计算机环境不一样,这就是多环境。开发环境—自己用的,测试环境—公司用的,生产环境——甲方。
<1>yaml 单文件版。
- 通过spring.profiles.active指定激活环境,用“---”分隔不同环境配置。其中 Spring Boot 新版本推荐的配置写法变更。
# 配置激活当前为dev环境 spring:profiles:active: dev --- # 生产环境配置 spring:profiles:active: prod server:port: 8080 --- # 开发环境配置 spring:profiles:active: dev server:port: 8081 --- # 测试环境配置 spring:profiles:active: test server:port: 8082
<2>yaml 多文件版。
- 主配置文件指定激活环境,各环境配置写在独立文件(命名规则为application-环境名.yml )中。
- 公共配置放主配置文件,有区别的放环境配置文件。
- 主配置文件(指定激活 test 环境)。
spring:profiles:active: test
- application-prod.yml (生产环境,端口 8080 )。
server:port: 8080
- application-dev.yml (开发环境,端口 8081 )。
server:port: 8081
- application-test.yml (测试环境,端口 8082 )。
server:port: 8082
<3>properties 多文件版。
- Spring Boot 早期配置格式。主配置文件指定激活环境,环境配置文件按application-环境名.properties命名。
- 主配置文件(指定激活 prod 环境)。
spring.profiles.active=prod
- application-prod.properties (生产环境,端口 8080 )。
server.port=8080
- application-dev.properties (开发环境,端口 8081 )。
server.port=8081
- application-test.properties (测试环境,端口 8082 )
server.port=8082