• 2023.11.15 关于 Spring Boot 配置文件


    目录

    引言

    Spring Boot 配置文件

     properties 配置文件说明

    基本语法

    读取配置文件

    优点

    缺点

    yml 配置文件说明 

    基本语法

    读取配置文件

    yml 配置不同数据数据类型及 null

    字符串 加单双引号的区别

    yml 配置 列表(List) 和 映射(Map)

     yml 读取映射(Map)

    读取映射(Map)

    读取 映射+列表 组合

    总结 

    properties 和 yml 配置文件的区别

    不同环境中的配置文件 


    引言

    Spring Boot 配置文件

    • 主要是用来写 "系统配置文件"
    • 例如 端口号设置、数据库连接设置、用户自定义配置文件 等
    • 文件格式有两种


    注意:

    • properties 配置文件是最早的配置文件格式,也是 Spring Boot 项目的默认配置文件
    • 如果在 properties 配置文件 和 yml 配置文件中出现了同样的配置
    • 那么 Spring Boot 会以 properties 中的配置为主
    • 因为 properties 配置文件的优先级最高
    • 即 先加载完 properties 配置文件才会加载 yml 配置文件
    • 虽然理论上 properties 配置文件 和 yml 配置文件可以共存,但通常会采取统一的配置文件格式

     properties 配置文件说明

    基本语法

    • properties 是以键值对的形式进行配置的
    • key 和 value 之间通过 " = " 连接
    1. # 配置端口号
    2. server.port = 8080
    3. # 配置数据库连接信息
    4. spring.datasource.url = mysql://127.0.0.1:3306/test?characterEncoding=utf8
    5. spring.datasource.username = root
    6. spring.datasource.password = 1111
    7. # 用户自定义配置
    8. myname = xiaolin
    • 通过 "#" 给配置文件添加注释信息
    • 关键字之间的 "." 为层次结构的分隔符,用于表示配置属性的层级关系

    读取配置文件

    • 通过 @Value 注解 加上固定格式 "${ }" 来读取配置文件
    • 如果不使用固定格式,直接在()中写字符串,则直接将该字符串赋值给其标记的变量
    • 此处我们读取上述文件中自定义配置的 myname 关键字
    1. import org.springframework.beans.factory.annotation.Value;
    2. import org.springframework.stereotype.Component;
    3. import javax.annotation.PostConstruct;
    4. @Component
    5. public class ReadProperties {
    6. @Value("${myname}")
    7. private String name;
    8. @PostConstruct
    9. public void printName() {
    10. System.out.println("我的名字是: " + name);
    11. }
    12. }

    运行结果:

    注意:

    • @PostConstruct 是 Java 中的一个注解,它用于标记一个方法,在实例化一个对象后,该方法会在依赖注入完成后被自动调用
    • 被 @PostConstruct 注解标记的方法不能有任何参数,并且不能声明为静态方法

    优点

    • 系统默认的配置文件
    •  properties 配置项的优先级比 yml 高
    • 格式简单(key value 格式)、不容易出错

    缺点

    • 写法存在冗余信息


    关于 properties 配置文件 的中文编码问题

    • 当你在 properties 配置文件中,使用 # 加上了一些中文注释
    • 那么可能会存在一个问题
    • 当你将当前项目文件关闭之后,再次重新使用 IDEA 打开该文件时,你的中文注释可能会变为乱码

    解决步骤

    1. 打开当前项目的设置

    2. 按下图所示更改配置

    3. 配置 下次创建新文件项目 的设置

    4. 重复第二步的操作

    5. 删除原 application.properties 文件

    6.重新再创建一个 application.properties 文件

    • 输入 application.properties,敲击回车键 即可

    yml 配置文件说明 

    • yml 格式可读性更高、写法更简洁、便于理解
    • 支持更多的数据类型,如 清单(数组)、散列表、标记等数据形态
    • 支持更多的编程语言,如 Java、Golang、PHP、Python、Ruby、JavaScript、Perl 等

    基本语法

    • yml 是树形结构的配置文件,它的基础语法是 "key:value"
    • 注意 key 和 value 之间使用 英文冒号 + 空格 方式组成
    • 空格一定不可省略!!
    1. # 配置端口号
    2. server:
    3. port: 8888
    4. # 连接数据库
    5. Spring:
    6. datasource:
    7. url: mysql://127.0.0.1:3306/test?characterEncoding=utf8
    8. username: root
    9. password: 1111

    读取配置文件

    • 与 properties 读取配置文件相同,使用 @Value 注解
    • 此处读取上述配置的端口号
    1. import org.springframework.beans.factory.annotation.Value;
    2. import org.springframework.stereotype.Component;
    3. import javax.annotation.PostConstruct;
    4. @Component
    5. public class ReadYml {
    6. @Value("${server.port}")
    7. private Integer port;
    8. @PostConstruct
    9. public void printPort() {
    10. System.out.println("配置的端口号是: " + port);
    11. }
    12. }

    运行结果:


    yml 配置不同数据数据类型及 null

    1. # 字符串
    2. string.value: nihao
    3. # 布尔值 true or false
    4. boolean.value1: true
    5. boolean.value2: false
    6. #整数
    7. int.value1: 20
    8. #二进制
    9. int.value2: 0b1100_1110_1010_1000_1111
    10. #浮点数
    11. float.value1: 2.716
    12. #科学计数法
    13. float.value2: 2716e-3
    14. # ~ 代表 null
    15. null.value: ~

    字符串 加单双引号的区别

    • 在 yml 中,不加引号的效果与加单引号的效果相同
    • 均会将特殊字符自动转义成原始字符
    • 双引号则区别于前面两者
    • 即不会将特殊字符自动转义成原始字符,例如 \n 在双引号中表示换行

    实例理解

    • yml 中配置文件如下所示
    1. string:
    2. str1: hello \n world!
    3. str2: 'hello \n world!'
    4. str3: "hello \n world!"
    • 通过 @Value 注解分别读取
    1. import org.springframework.beans.factory.annotation.Value;
    2. import org.springframework.stereotype.Component;
    3. import javax.annotation.PostConstruct;
    4. @Component
    5. public class ReadYml {
    6. @Value("${string.str1}")
    7. private String str1;
    8. @Value("${string.str2}")
    9. private String str2;
    10. @Value("${string.str3}")
    11. private String str3;
    12. @PostConstruct
    13. public void printString() {
    14. System.out.println(str1);
    15. System.out.println(str2);
    16. System.out.println(str3);
    17. }
    18. }

    运行结果:


    yml 配置 列表(List) 和 映射(Map)

    1. # name list列表
    2. name-list1:
    3. - 小林
    4. - 小王
    5. - 小美
    6. # name list列表 写法二(行内写法)
    7. name-list2: [小林,小王,小美]
    •  上述示例中 name-list1 和 name-list2 是一个包含三个字符串的 元素列表(List)
    • 其中 " - 小林 ","小林" 和 "-" 符号直接必须有空格,其他亦是如此
    1. # student map映射 写法一
    2. student1:
    3. id: 1
    4. name: xiaolin
    5. age: 20
    6. # student map映射 写法二 (行内写法)
    7. student2: {id: 1,name: xiaolin,age: 20}
    •  上述示例中 student1 和 student2 是一个包含三个键值对的映射 (Map)
    • 此处的 映射(Map) 可以简单理解为 yml 中的 student "对象" 
    1. # name map映射 + list列表
    2. name-map3:
    3. class1:
    4. - 小林
    5. - 小王
    6. class2: 小美
    7. # name map映射 + list列表 写法二 (行内写法)
    8. name-map4: {class1: [小林,小王], stu2: 小美}
    • 上述示例中 name-map3 和 name-map4 是一个 映射(Map),其包含两个键值对
    • 键 class1 对应的值是一个列表(List),包含两个字符串元素:"小林" 和 "小王"
    • 键 class2 对应的值是一个字符串 "小美"
    1. # name list列表 + map映射
    2. name-list3:
    3. - name: 小林
    4. age: 20
    5. - name: 小王
    6. age: 19
    7. # name list列表 + map映射 写法二 (行内写法)
    8. name-list4: [{name: 小林, age: 20}, {name: 小王, age: 19}]
    • 上述示例中 name-list3 和 name-list4 是一个列表(List),其包含两个映射(Map)
    • 每个映射(Map)都有 name 和 age 两个键值对

     yml 读取映射(Map)

    • 在 yml 配置文件中读取映射(Map)不能使用 @Value 注解
    • 需使用 @ConfigurationProperties 注解来读取
    • 此注解的参数是一个键值对形式,形如 prefix = "映射名称"
    • 或不写键值对形式,直接写 映射名称 也 OK
    • 该注解需要搭配与该映射相对应的实体类
    • 该实体类有如下要求:
    • 属性名必须要以 yml 配置中的 key 值一致
    • 必须要有 setter 和 getter 方法,因为需要这两个方法初始化实体类对象

    读取映射(Map)

     实例理解

    • 为了读取上述的 student1 映射(Map)
    • 此处我们创建一个 Student 实体类
    • 此处我们使用 LomBok 的 @Data 注解来提供 setter 和 getter 方法
    1. import lombok.Data;
    2. import org.springframework.boot.context.properties.ConfigurationProperties;
    3. import org.springframework.stereotype.Component;
    4. //# student map映射 写法一
    5. // student1:
    6. // id: 1
    7. // name: xiaolin
    8. // age: 20
    9. //@ConfigurationProperties("student1") 写成该形式也是 OK 的
    10. @ConfigurationProperties(prefix = "student1")
    11. @Component
    12. @Data
    13. public class Student {
    14. public int id;
    15. public String name;
    16. public int age;
    17. }
    • 此处我们创建 ReadStudent 类来调用该实体类
    1. import com.example.demo.enity.Student;
    2. import org.springframework.beans.factory.annotation.Autowired;
    3. import org.springframework.stereotype.Component;
    4. import javax.annotation.PostConstruct;
    5. @Component
    6. public class ReadStudent {
    7. @Autowired
    8. private Student student;
    9. @PostConstruct
    10. public void printStudent() {
    11. System.out.println(student.toString());
    12. }
    13. }

    运行结果:

    读取 映射+列表 组合

    实例理解

    • 先创建一个对应的 nameMap3 类,并在该类中定义一个用于存储列表的属性
    1. import lombok.Data;
    2. import org.springframework.boot.context.properties.ConfigurationProperties;
    3. import org.springframework.stereotype.Component;
    4. import java.util.List;
    5. //# name map映射 + list列表
    6. // name-map3:
    7. // class1:
    8. // - 小林
    9. // - 小王
    10. // class2: 小美
    11. @ConfigurationProperties("name-map3")
    12. //@ConfigurationProperties(prefix = "name-map3")
    13. @Component
    14. @Data
    15. public class NameMap3 {
    16. private List class1;
    17. private String class2;
    18. }
    • 再创建一个 ReadNameMap3 类来调用 nameMap3 类的属性 calss1 和 class2
    1. import com.example.demo.enity.NameMap3;
    2. import org.springframework.beans.factory.annotation.Autowired;
    3. import org.springframework.stereotype.Component;
    4. import javax.annotation.PostConstruct;
    5. @Component
    6. public class ReadNameMap3 {
    7. @Autowired
    8. private NameMap3 nameMap3;
    9. @PostConstruct
    10. public void printNameList1() {
    11. System.out.println(nameMap3.toString());
    12. }
    13. }

    运行结果:

    总结 

    properties 和 yml 配置文件的区别

    • 数据格式:properties 是以 key=value 的形式配置的键值类型的配置文件,而 yml 使用的是类似 json 格式的树形配置方式进行配置的,yml 层级之间使用换行缩进的方式配置,且 value 前的空格不可省略
    • 数据类型:yml 支持更多的数据类型
    • 通用性:yml 的通用性更好,支持更多语言,如 Java、Go、Python 等,如果是云服务器开发,可以使用一份 配置文件作为 Java 和 Go 的共同配置文件
    • 优化:properties 作为早期并默认的配置文件格式,存在一定的冗余数据,使用 yml 可以很好的解决冗余问题

    不同环境中的配置文件 

    •  在实际工作中,一般会存在两种环境
    • 分别为 生产环境 和 开发环境
    • 针对这两种环境,我们需要使用不同的 yml 配置文件
    • application-dev.yml (开发环境)
    •  application-prod.yml (生产环境)
    • 此处的文件开头 "application-" 是固定的,其分隔符后可自定义名称
    1. spring:
    2. profiles:
    3. active: dev
    • 在 application.yml 配置文件中加上 该代码 便可实现运行 dev 即开发环境的配置文件
    • 如果想运行 生产环境,将 dev 替换为 prod 即可
  • 相关阅读:
    2022数学建模国赛如何安排进度?川川学长精心讲解
    尚硅谷大数据项目《在线教育之实时数仓》笔记005
    Cesium从已知的自定义材质扩展其他效果(二)
    经典卷积神经网络 - VGG
    PID算法从入门到放弃
    使用transformers增加token
    图文翻译-免费图文翻译-批量图文翻译软件
    tomcat必要的配置
    剑指Offer || 056.两数之和 IV - 输入二叉搜索树
    教你快速看懂 vue 路由守卫
  • 原文地址:https://blog.csdn.net/weixin_63888301/article/details/134430335