一、配置文件是什么?为什么需要配置文件?
1 什么是硬编码?
先看一个例子:
假设我们现在需要编写一个 Java 程序,规定用户访问服务器时使用的端口号为 8080。
我们可能会直接在代码中写:
java
public class Server {
public void start() {
int port = 8080;
System.out.println("服务器启动,端口号:" + port);
}
}
这里的 8080 就直接写在了程序代码里面。
如果以后我们想把端口号修改为 9090,就必须修改 Java 代码,然后重新编译、打包、部署。
这种将数据直接写在程序代码中的方式,就叫作硬编码。
硬编码:
-
数据直接写在程序源代码中。
-
修改数据通常需要修改代码。
-
程序的配置和业务逻辑混在一起。
-
不方便统一管理。
2 为什么需要配置文件?
现在我们换一种方式。
不再将端口号直接写在 Java 代码中,而是把它放在配置文件里面。
例如:
server.port=8080
Java 程序启动时,读取配置文件中的端口号。
如果以后需要修改端口,只需要修改配置文件:
server.port=9090
Java 业务代码不需要修改。
这就是配置文件的核心作用:
将程序中可能发生变化的信息,从程序代码中独立出来,统一放在配置文件中进行管理
3 Spring Boot 中有哪些信息需要配置?
在实际 Java 后端项目中,有很多信息不适合直接写死在 Java 代码中。
例如:
① 项目启动端口
Spring Boot 内置了 Tomcat 服务器,默认端口号是 8080。
但是如果电脑上的 8080 端口已经被其他程序占用,就需要修改端口号。
② 数据库连接信息
例如:
-
数据库地址。
-
数据库名称。
-
数据库用户名。
-
数据库密码。
不同项目连接的数据库可能不同,因此需要支持用户自行配置。
③ 第三方系统调用密钥
例如调用第三方支付平台、短信平台时,需要使用对应的密钥。
④ 日志配置
项目运行时可能需要记录普通日志、异常日志,方便开发人员排查问题。
这些信息都可以放在配置文件中
二、Spring Boot 配置文件快速入门
1 找到配置文件

在我们创建spring项目的时候,idea已经帮我们创建好了配置文件
Spring Boot 支持三种常见的配置文件格式:
| 配置文件 | 说明 |
|---|---|
| application.properties | Properties 格式 |
| application.yml | YAML 格式 |
| application.yaml | YAML 格式 |
我们要是创建配置文件的话就放在跟application.propertices一个目录下面
并且Properties 的优先级高于 YML
2 Properties 基本语法
Properties 使用的是键值对的方式进行配置。
基本格式:
key=value
举个例子:
java
# 配置项目端口号
server.port=8080
# 配置数据库连接信息
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
这个点是什么:可以将这个理解为是一个层级,就拿配置端口号的就是server相关的port设置
使用 @Value 读取配置文件
java
mykey.key1=bite
java
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class PropertiesController {
@Value("${mykey.key1}")
private String key1;
@RequestMapping("key")
public String key(){
return "key:"+key1;
}
}

@Value表示从配置中获取值并且注入到当前属性
其中${mykey.key1}就是表示我们需要去读取的配置项的名称
Propertices的优缺点
Propertices的优点
代码基本上都可以写在一行,并且通过点这种形式还是比较清楚的理解关系的
Propertices的缺点
配置项比较多的时候,会出现大量重复的内容,就比如DataSource下面有名字,url以及密码这些配置,如果我们要写的话,每一个配置前面都需要写上DataSource
3 YML 配置文件
YML 基本语法
YML 的基础语法:
key: value
注意:
key 和 value 之间必须使用英文冒号加空格的方式连接
对比两种写法
Properties 写法:
java
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/dbname?characterEncoding=utf8&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
YML 写法:
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/dbname?characterEncoding=utf8&useSSL=false
username: root
password: root
YML可以通过换行的格式来表示层级关系,这样可以少些一些代码
YML 配置不同数据类型
YML 不仅可以配置字符串,还可以配置多种数据类型。
① 字符串
string:
value: Hello
表示字符串类型。
② 布尔值
boolean:
value: true
value1: false
布尔类型只有两个值:
-
true:真。
-
false:假。
③ 整数
int:
value: 10
④ 浮点数
float:
value: 3.14159
⑤ Null 空值
null:
value: ~
这里的 ~ 表示 null。
也可以理解为没有实际的值。
注意:
null 和空字符串不是一回事。
⑥ 空字符串
empty:
value: ''
这里表示一个空字符串。
也就是字符串存在,但是里面没有任何字符
使用 @Value 读取 YML
java
string:
hello: bite
java
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ReadYmlController {
@Value("${string.hello}")
private String hello;
@RequestMapping("/ymlKey")
public String key() {
return "读取到值:" + hello;
}
}

YML 中单双引号的区别
java
string:
str1: Hello \n Spring Boot.
str2: 'Hello \n Spring Boot.'
str3: "Hello \n Spring Boot."
其中单引号跟没有引号中的\n就是\n不是换行,但是双引号当中的\n表示换行
YML 配置对象
java
student:
id: 1
name: Java
age: 18
java
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@ConfigurationProperties(prefix = "student")
@Component
@Data
public class Student {
private int id;
private String name;
private int age;
}
当我们希望spring boot将这些配置自动绑定到student对象的多个属性上,就需要用到@ConfigurationProperties这个注解,将yml文件中的student这个配置,一个一个加到我们写得Student类上面,并且一一对应
配置 List 集合
java
dbtypes:
name:
- mysql
- sqlserver
- db2
一个 - 表示一个元素
配置 Map 集合
java
maptypes:
map:
k1: kk1
k2: kk2
k3: kk3
YML 的优缺点
YML 的优点
① 可读性高
YML 使用树形结构组织配置
不需要反复写相同的前缀,结构更加直观
② 支持更多的数据类型
可以直接表达:对象,数组,List,Map
尤其是复杂的层级关系,可以使用缩进来表达
③ 支持多种编程语言
YAML 并不只是 Java 才能使用
Golang、Python、Ruby、JavaScript 等语言也可以使用 YAML 格式
因此它具有比较广泛的应用场景
YML 的缺点
① 不适合编写某些复杂配置文件
② 对格式要求比较严格