一、配置文件有什么用?
整个项目中所有重要的数据都是在配置文件中配置的,比如:
数据库的连接信息(包含用户名和密码的设置)
项目的启动端口
第三方系统的调用秘钥等信息
用于发现和定位问题的普通日志和异常日志等
想象一下如果没有配置信息,那么 Spring Boot 项目就不能连接和操作数据库,甚至是不能保存可以用于排查问题的关键日志,所以配置文件的作用是非常重要的。
二、配置文件的两种格式
application.properties
application.yml
properties 可以和 yml 一起存在于一个项目当中。当 properties 和 yml 一起存在一个项目中时,如果配置文件中出现了同样的配置,比如 properties 和 yml 中都配置了“server.port”那么这个时候会以 properties 中的配置为主,也就是properties的优先级更高
虽然.properties 可以和 .yml 共存,但实际的业务当中,我们通常会采取一种统一的配置文件格式,这样可以更好的维护(降低故障率)。
properties说明
properties 配置文件是最早期的配置文件格式,也是创建 Spring Boot 项目默认的配置文件。properties 是以键值的形式配置的, key 和 value 之间是以“=”连接的
properties 不支持中文
# 配置项目端口号
server.port=8084
# 链接数据库
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root
yml 说明
yml 是 YAML 是缩写,全称是 Yet Another Markup Language 翻译成中文就是“另一种标记语言”
也是现在 推荐使用的,大多数公司现在也在使用yml配置文件
ymI优点分析:
yml 是一个可读性高,写法简单、易于理解,它的语法和 JSON 语言类似。
yml 支持更多的数据类型,它可以简单表达清单(数组)、散列表,标量等数据形态。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件等。
yml 支持更多的编程语言,比如Java、 Golang、PHP、Python、Ruby、JavaScript、Perl 中。
支持中文
ymI是树形结构的配置文件,基础语法是“key: value”,格的方式组成的,其中的空格不可省略。
![](https://img-blog.csdnimg.cn/img_convert/33af2d99a7c04145b53d3ca2bd4b211e.png)
spring:
datasource:
url: jdbc:mysql://127.0.0.0:3306/dbname?characterEncoding=utf8
username: root
password: root
三、读取配置文件@Value
如果在项目中,想要主动的读取配置文件中的内容,可以使用 @Value 注解来实现。
@Value 注解使用 “${}” 的格式读取
@Controller
@ResponseBody
public class ControllerTest {
@Value("server.port")//注意这里使用引号 “”
String port;
@RequestMapping("/testProperties")
public String testProperties() {
return port;
}
}
//上述代码访问http://127.0.0.1:8080/testProperties,浏览器输出 port
//这样的写法是错误的,必须使用 "${}" 的格式
@Controller
@ResponseBody
public class ControllerTest {
@Value("${server.port}")//注意这里使用的格式
String port;
@RequestMapping("/testProperties")
public String testProperties() {
return port;
}
}
//这样访问http://127.0.0.1:8444/testProperties,浏览器输出 8080
//正确了,一定要注意这个格式
四、yml进阶
(1) yml 配置不同数据类型及 null
# 字符串
myString1: Hello
myString1: 'Hello'
myString1: "Hello"
# 布尔值,true或false
myBoolean1: true
myBoolean2: false
# 整数
myInt1: 10
myInt2: 0b1010_0111_0100_1010_1110 # 二进制
# 浮点数
myFloat1: 3.14159
myFloat2: 314159e-5 # 科学计数法
# Null,~代表null
null.value: ~
字符串
注意字符串的三种表示方法是有区别的
从上述结果可以看出:
字符串默认不用加上单引号或者双引号
单引号会转义特殊字符,特殊字符最终只是一个普通的字符串数据
双引号不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思
//yml文件的内容
myString1: Hello\n word. # 结果没有换行
myString2: 'Hello\n word.' # 结果没有换行
myString3: "Hello\n word." # 结果换行
//Java程序
@Value("${myString1}")
String myString1;
@Value("${myString2}")
String myString2;
@Value("${myString3}")
String myString3;
@PostConstruct
public void postConstruct() {
System.out.println("myString1:" +myString1);
System.out.println("myString2:" +myString2);
System.out.println("myString3:" +myString3);
}
//打印结果
myString1:Hello\n word.
myString2:Hello\n word.
myString3:Hello
word.
(2) 配置对象
yml配置对象,如下图所示有两种写法
# 第一种:行外写法
student:
id: 1
name: Java
age: 18
# 第二种:行内写法
student: {id: 1,name: Java,age: 18}#注意行内 :后仍需加空格
对象的读取
读取对象使用 @ConfigurationProperties("对象名")
![](https://img-blog.csdnimg.cn/img_convert/306585fc46654caaa8f9f9a1499e7964.png)
@Autowired
Student student;
@PostConstruct
public void postConstruct(){
System.out.println(student);
}
//打印结果:
Student(name=小明, age=12, gender=男)
(3) 配置集合
yml配置集合同样有两种写法
# 第一种:行外写法
dbtypes:
name:
- mysql
- sqlserver
- db2
# 第二种:行内写法
dbtypes: {name: [mysql,sqlserver,db2]}
对象的读取
集合的读取和对象一样,也是使用 @ConfigurationProperties 来读取的,具体实现如下:
// 这样name里面就会有上面配置的值
@Component
@Data
@ConfigurationProperties("dbtypes")
public class ListConfig {
private List<String> name;
}
//这里的打印就会出现配置的值
@Component
public class ReadYml2 {
@Autowired
private ListConfig listConfig;
@PostConstruct
public void postConstruct() {
System.out.println(listConfig.getName());
}
}
(4) 不同环境的配置文件
通常命名配置文件是有格式的
开发环境: application-dev.yml
测试环境: application-prod.yml
一般开发中会有三个yml配置文件,application-dev.yml和application-prod.yml 分别表示开发配置和测试配置。application.yml 表示指定使用哪一个配置
![](https://img-blog.csdnimg.cn/img_convert/316443e8fd9c4203aa70400f90ce19a0.png)
五、更多的配置设置
要查看 Spring Boot 更多系统配置项,访问官网: