1.配置文件的作用
整个项目中所有重要的数据都是在配置文件中配置的:
- 数据库的链接信息(包含用户名和密码的设置);
- 项目的启动端口;
- 第三方系统的调用秘钥等信息;
- 用于发现和定位问题的普通日志和异常日志等。
2.配置文件的格式
Spring Boot配置文件主要分为以下两种格式:
- .properties
- .yml
如下图所示:
【说明】
- .properties是我们创建Spring Boot项目自带的配置文件,.yml是我们自己创建的一种配置文件,名字需要和项目自带的配置文件名字相同,只是后缀不同
- properties可以和yml一起存在于一个项目中,如果配置文件中出现了相同的配置,比如properties设置端口号为8888,yml设置端口号8080,那么我们以项目自身的配置文件(properties)为主。就是说.properties配置文件的优先级最高,但加载完 .propertise 文件以后,也会加载 .yml 文件的配置信息。
- 理论上来讲 .properties 可以和 .yml 共存,但是实际业务中为了方便管理,我们会统一适用 .yml配置文件,这样可以更好的维护。就像我们聊天时可能适用微信或QQ,但是我们同时适用会导致频繁的切换,所以我们更加偏向一个聊天软件。
3.properties 配置文件说明
.properties是项目Spring Boot项目默认的配置文件。
3.1properties基本语法
properties是按照键值对的形式配备的,key和value之间是以“=”链接的,比如:
PS:配置文件中的注释是适用#表示的。
properties模式的编码方式不是UTF8,我们要进行设置,否则这里会出现乱码的情况。
3.2读取配置文件
如果在项目中,我们需要主动的读取配置文件中的内容,我们可以适用@Value注解来实现。@Value注解使用“${}"的格式读取,代码如下
package com.example.demo.component;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
/**
* Describe:
* User:lenovo
* Date:2023-07-24
* Time:10:42
*/
@Component
public class ReadYml {
@Value("${server.port}")
private String port;
@PostConstruct
public void postConstruct() {
System.out.println("端口号: " + port);
}
}
@PostConstruct只是让这个方法随着项目的启动而运行,我们不用过度深究。
3.3propertise缺点分析
properties配置文件是以kye-value的形式配置的,如下
从上面的配置中我们发现很多都是重复的内容,比如:spring.datasource。为了解决这个问题,我们可以使用 .yml文件
4.yml配置文件说明
yml的全程为 Yet Another Markup Language,翻译成中文“另一种标记语言”,同时还可以简写为yaml,同时文件的后缀使用.yaml也是可以的。
【优点分析】
- yml是一个可读性很高,易于理解,它的语法和JSON语言相类似。
- yml支持更多的数据类型,它可以简单表达数组、散列表、标量等数据形态。它使用空白符号缩进和大量依赖外观的特色,特别适合来表达或编辑数据结构、各种配置文件等等。
- yaml支持更多的编程语言,如Java,golang,PHP, Python, Ruby、JS、Perl等
为什么推荐使用 .yml?
很多的编程语言可能使用自己的配置文件,它们的配置文件可能不能被其他的语言识别,这就导致在项目中出现很多的配置文件,并且在内容上基本相同,导致配置如果发生变化,我们需要更改很多的配置文件。使用.yaml可以有效的避免这种问题。
4.1yml基本语法
yaml是树形结构的配置文件,它的基本语法是“key: value",注意key和value之间是英文的:和空格的方式组成的,其中的空格是不能省略的。
【使用yml链接数据库】
我们发现使用 .yml,省去了一些繁琐的过程,但是并不是意味着它非常好用。如果我们省略了值前面的空格,键前面的空格少了一个都会出现报错的情况。对于新手学习者不是很友好。
4.2yml使用进阶
4.2.1yml配置不同数据类型
4.2.1.1yml配置读取
yml读取配置的方式和properties相同,使用@Value注解即可,实现代码如下:
@Component
public class ReadYml {
// @Value("${server.port}")
// private String port;
//
// @PostConstruct
// public void postConstruct() {
// System.out.println("端口号: " + port);
// }
@Value("${String.value}")
private String hello;
@PostConstruct
public void postConstruct() {
System.out.println("字符串:" + hello);
}
}
4.2.1.2练习
使用代码测试一下,读取值为null的配置和根本不存在的配置结果是否相同
@Value("${null.value}")
private String ret;
@PostConstruct
public void postConstruct() {
System.out.println("Null的结果:" + ret);
}
4.2.1.3注意事项
字符串默认是不用加上单引号或者双引号的,如果加了引文的单双引号可能表示特殊的含义。
从上述的结果看:
- 字符串默认不需要加单引号或双引号
- 单引号不会转义特殊字符,特殊字符只是一个普通的数据
- 双引号会转义特殊字符,特殊字符会有自己的含义
4.2.2配置对象
我们还可以在yml中配置对象,如下所示:
这个时候我们不能再使用@Value来读取配置中的对象了,我们需要另一个注解@ConfigurationProperties来读取,具体实现如下:
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* Describe:
* User:lenovo
* Date:2023-07-24
* Time:20:20
*/
@ConfigurationProperties(prefix = "student")
@Component
@Data
public class StudentComponent {
private int id;
private String name;
private int age;
}
注意:@Data是lombok插件中关键字,可以自动生成get(), set(), toString()等方法
调用这个类
@Component
public class ReadYml2 {
@Autowired
private StudentComponent studentComponent;
@PostConstruct
public void doPostConstruct() {
System.out.println(studentComponent);
}
}
4.2.3配置集合
配置文件还能配置list集合,如下所示:
#配置集合
dbtypes:
name:
- mysql
- sqlserver
- bd2
#行内写法
dbtypes1: {name: [mysql,sqlserver,db2]}
集合的读取和对象类似,也是使用@ConfigurationProperties来读,实现如下:
@Component
@Data
@ConfigurationProperties("dbtypes")
public class ListComponent {
private List<String> name;
}
打印类的实现如下:
@Autowired
private ListComponent listComponent;
@PostConstruct
public void doPostConstruct1(){
System.out.println(listComponent);
}
更多的配置我们可以查看官网:Common Application Properties (spring.io)
5.properties VS yml
- properties是采用key=value的形式配置键值类型的配置文件,yml使用的是类似json格式的树形配置方式,yml层级之间使用换行缩进的方式,同时键值之间使用“: ”的方式分隔
- properties是早期并且默认的配置文件
- yml通用性刚好,支持更多的语言
- yml支持更多的数据类型