2023.11.15 关于 Spring Boot 配置文件

目录

引言

[Spring Boot 配置文件](#Spring Boot 配置文件)

[properties 配置文件说明](#properties 配置文件说明)

基本语法

读取配置文件

优点

缺点

[yml 配置文件说明](#yml 配置文件说明)

基本语法

读取配置文件

[yml 配置不同数据数据类型及 null](#yml 配置不同数据数据类型及 null)

[字符串 加单双引号的区别](#字符串 加单双引号的区别)

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

[yml 读取映射(Map)](#yml 读取映射(Map))

读取映射(Map)

[读取 映射+列表 组合](#读取 映射+列表 组合)

总结

[properties 和 yml 配置文件的区别](#properties 和 yml 配置文件的区别)

不同环境中的配置文件


引言

Spring Boot 配置文件

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

注意:

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

properties 配置文件说明

基本语法

  • properties 是以键值对的形式进行配置的
  • key 和 value 之间通过 " = " 连接
XML 复制代码
# 配置端口号
server.port = 8080

# 配置数据库连接信息
spring.datasource.url = mysql://127.0.0.1:3306/test?characterEncoding=utf8
spring.datasource.username = root
spring.datasource.password = 1111

# 用户自定义配置
myname = xiaolin
  • 通过 "#" 给配置文件添加注释信息
  • 关键字之间的 "." 为层次结构的分隔符,用于表示配置属性的层级关系

读取配置文件

  • 通过 @Value 注解 加上固定格式 "${ }" 来读取配置文件
  • 如果不使用固定格式,直接在()中写字符串,则直接将该字符串赋值给其标记的变量
  • 此处我们读取上述文件中自定义配置的 myname 关键字
java 复制代码
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;

@Component
public class ReadProperties {

    @Value("${myname}")
    private String name;

    @PostConstruct
    public void printName() {
        System.out.println("我的名字是: " + name);
    }
}

运行结果:

注意:

  • @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 之间使用 英文冒号 + 空格 方式组成
  • 空格一定不可省略!!
XML 复制代码
# 配置端口号
server:
  port: 8888

# 连接数据库
Spring:
  datasource:
    url: mysql://127.0.0.1:3306/test?characterEncoding=utf8
    username: root
    password: 1111

读取配置文件

  • 与 properties 读取配置文件相同,使用 @Value 注解
  • 此处读取上述配置的端口号
java 复制代码
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

@Component
public class ReadYml {

    @Value("${server.port}")
    private Integer port;

    @PostConstruct
    public void printPort() {
        System.out.println("配置的端口号是: " + port);
    }
}

运行结果:


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

XML 复制代码
# 字符串
string.value: nihao

# 布尔值 true or false
boolean.value1: true
boolean.value2: false

#整数
int.value1: 20
#二进制
int.value2: 0b1100_1110_1010_1000_1111

#浮点数
float.value1: 2.716
#科学计数法
float.value2: 2716e-3

# ~ 代表 null
null.value: ~

字符串 加单双引号的区别

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

实例理解

  • yml 中配置文件如下所示
XML 复制代码
string:
  str1: hello \n world!
  str2: 'hello \n world!'
  str3: "hello \n world!"
  • 通过 @Value 注解分别读取
java 复制代码
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

@Component
public class ReadYml {

    @Value("${string.str1}")
    private String str1;

    @Value("${string.str2}")
    private String str2;

    @Value("${string.str3}")
    private String str3;

    @PostConstruct
    public void printString() {
        System.out.println(str1);
        System.out.println(str2);
        System.out.println(str3);
    }
}

运行结果:


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

java 复制代码
# name list列表
name-list1:
  - 小林
  - 小王
  - 小美

# name list列表 写法二(行内写法)
name-list2: [小林,小王,小美]
  • 上述示例中 name-list1 和 name-list2 是一个包含三个字符串的 元素列表(List)
  • 其中 " - 小林 ","小林" 和 "-" 符号直接必须有空格,其他亦是如此
XML 复制代码
# student map映射 写法一
student1:
  id: 1
  name: xiaolin
  age: 20

# student map映射 写法二 (行内写法)
student2: {id: 1,name: xiaolin,age: 20}
  • 上述示例中 student1 和 student2 是一个包含三个键值对的映射 (Map)
  • 此处的 映射(Map) 可以简单理解为 yml 中的 student "对象"
java 复制代码
# name map映射 + list列表
name-map3:
  class1:
    - 小林
    - 小王
  class2: 小美

# name map映射 + list列表 写法二 (行内写法)
name-map4: {class1: [小林,小王], stu2: 小美}
  • 上述示例中 name-map3 和 name-map4 是一个 映射(Map),其包含两个键值对
  • 键 class1 对应的值是一个列表(List),包含两个字符串元素:"小林" 和 "小王"
  • 键 class2 对应的值是一个字符串 "小美"
XML 复制代码
# name list列表 + map映射
name-list3:
  - name: 小林
    age: 20
  - name: 小王
    age: 19

# name list列表 + map映射 写法二 (行内写法)
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 方法
java 复制代码
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

//# student map映射 写法一
//    student1:
//    id: 1
//    name: xiaolin
//    age: 20

//@ConfigurationProperties("student1") 写成该形式也是 OK 的
@ConfigurationProperties(prefix = "student1")
@Component
@Data
public class Student {
    public int id;
    public String name;
    public int age;
}
  • 此处我们创建 ReadStudent 类来调用该实体类
java 复制代码
import com.example.demo.enity.Student;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

@Component
public class ReadStudent {

    @Autowired
    private Student student;

    @PostConstruct
    public void printStudent() {
        System.out.println(student.toString());
    }
}

运行结果:

读取 映射+列表 组合

实例理解

  • 先创建一个对应的 nameMap3 类,并在该类中定义一个用于存储列表的属性
java 复制代码
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.List;

//# name map映射 + list列表
//      name-map3:
//        class1:
//          - 小林
//          - 小王
//        class2: 小美

@ConfigurationProperties("name-map3")
//@ConfigurationProperties(prefix = "name-map3")
@Component
@Data
public class NameMap3 {
    private List<String> class1;
    private String class2;
}
  • 再创建一个 ReadNameMap3 类来调用 nameMap3 类的属性 calss1 和 class2
java 复制代码
import com.example.demo.enity.NameMap3;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;

@Component
public class ReadNameMap3 {
    @Autowired
    private NameMap3 nameMap3;

    @PostConstruct
    public void printNameList1() {
        System.out.println(nameMap3.toString());
    }
}

运行结果:

总结

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-" 是固定的,其分隔符后可自定义名称
XML 复制代码
spring:
  profiles:
    active: dev
  • application.yml 配置文件中加上 该代码 便可实现运行 dev 即开发环境的配置文件
  • 如果想运行 生产环境,将 dev 替换为 prod 即可
相关推荐
工一木子2 分钟前
【Java项目脚手架系列】第七篇:Spring Boot + Redis项目脚手架
java·spring boot·redis
LunarCod20 分钟前
Ubuntu使用Docker搭建SonarQube企业版(含破解方法)
linux·运维·服务器·ubuntu·docker·开源·sonarqube
betazhou31 分钟前
基于Linux环境实现Oracle goldengate远程抽取MySQL同步数据到MySQL
linux·数据库·mysql·oracle·ogg
lyrhhhhhhhh1 小时前
Spring 框架 JDBC 模板技术详解
java·数据库·spring
惜.己1 小时前
Linux常用命令(十四)
linux·运维·服务器
喝醉的小喵2 小时前
【mysql】并发 Insert 的死锁问题 第二弹
数据库·后端·mysql·死锁
BillKu2 小时前
服务器多JAR程序运行与管理指南
运维·服务器·jar
付出不多3 小时前
Linux——mysql主从复制与读写分离
数据库·mysql
初次见面我叫泰隆3 小时前
MySQL——1、数据库基础
数据库·adb
Chasing__Dreams3 小时前
Redis--基础知识点--26--过期删除策略 与 淘汰策略
数据库·redis·缓存