目录
配置文件的作用
配置文件的格式
.properties文件说明
基本语法
读取配置文件
缺点分析
.yml 配置文件说明
优点分析
基本语法
使用yml连接数据库
yml配置不同数据类型及null
yml配置读取
value值加单双引号
yml对象
yml配置集合类
properties VS yml
SpringBoot 有几种读取配置文件的方法?
整个项目中所有重要的数据都是在配置文件中配置的, 例如:
想象一下如果没有配置信息, 那么springBoot项目就不能连接和操作数据库, 甚至是不能保存可以用于排查问题的日志, 所以配置文件是非常重要的.
配置文件spring boot分为以下两种:
如下图所示:
可以类比一下服装店的服装一样, 有两种不同的款式, properties相当于老款式, yml相当于新款式.
理论上将properties可以和yml一起存在于一个项目当中, 当properties和yml在一起的时候, 如果配置文件中出现了同样的配置, 比如properties和yml中都配置了server.port, 那么这个时候会以properties为主, 也就是properties的配置文件的优先级最高, 但是加载完.properties文件之后也会加载yml文件的配置信息
虽然理论上将properties可以和yml共存, 但实际业务当中, 我们通常会采用一种统一的配置文件格式, 这样可以更好的维护.
properties是以键值对的形式配置的, key 和 value之间是以 "=" 连接的, 例如:
server.port=8088
spring.datasource,url=jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=2222
配置文件中使用#来添加注释
如果在项目中, 想要主动的读取配置文件中的内容, 可以使用@Value注解来实现, @Value注解使用${} 的格式来读取, 如下代码:
package com.example.demo1.Test;
import jakarta.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class TestValue {
@Value("${server.port}")
private String port;
@PostConstruct
public void postConstruct() {
System.out.println("Read server port : " + port);
}
}
启动项目, 如下:
@Component 在springboot启动的时候会注入到框架当中, 注入到框架中会执行@PostConstruct初始化方法, 这个时候就会在控制台输出这个配置信息了.
properties配置文件中的配置是以键值对的形式出现的, 也就是key-value形式出现的, 可以对比java集合体系中的map, 如下图所示:
yml是YAML的缩写, 全称为yet another markup language, 中文示意为另外一种标记语言
yml是树形结构的配置文件, 它的基础语法是key: value, 注意这里的冒号和value之间有一个空格, 这个空格是不能省略的.
基础语法如下:
# 正确的配置方式
String: java
# 错误的配
string2:mysql
显示无效子元素
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8
username: root
password: 2222
和properties配置连接数据库进行对比:
server.port=8088
spring.datasource,url=jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=2222
可以看见properties配置文件中有很多冗余项
# 字符串
string.value: hello
# boolean: true or false
boolean.value: true
boolean.value2: false
# 整数
int.value: 12
int.value2: 0b1010_0111_1100_1111 # 二进制
# 浮点数
float.value: 3.1415926
float.value2: 31415926e-7 # 科学计数法
表示null:
null.value: ~
同样使用@Value("${value}") 来读取:
定义字符串:
进行读取:
package com.example.demo1.Test;
import jakarta.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class TestValue {
@Value("${string.value}")
private String value;
@PostConstruct
public void postConstruct() {
System.out.println("read yml string.value : " + value);
}
}
启动项目, 输出:
尝试读取null.value: ~, 读取为null的配置和根本不存在的配置结果是否一致?
设置null:
null.value: ~
读取null.value
package com.example.demo1.Test;
import jakarta.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class TestValue {
@Value("${null.value}")
private String value;
@PostConstruct
public void postConstruct() {
System.out.println("read yml null.value : " + value);
}
}
输出:
通过调试发现, 获取的null.value为空字符串:
在配置文件中, 字符串时默认不用加上单双引号的, 如果加英文的单引号可以表示特殊含义.
例如尝试在application.yml中配置如下数组:
string:
str1: hello \n world
str2: 'hello \n world'
str3: "hello \n world"
进行读取, 代码如下:
package com.example.demo1.Test;
import jakarta.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class TestValue {
@Value("${string.str1}")
private String str1;
@Value("${string.str2}")
private String str2;
@Value("${string.str3}")
private String str3;
@PostConstruct
public void postConstruct() {
System.out.println("read str1:" + str1);
System.out.println("read str2:" + str2);
System.out.println("read str3:" + str3);
}
}
输出如下:
从上述结果可以看出:
对应java中的类, yml也可以配置对象, 例如下面配置一个Student对象:
stduent:
id: 2323
name: zhangSan
age: 18
或者是写在一行, 使用{} 来表示:
student2: {id: 2323,name: zhangSan,age: 18}
这个时候就不能使用@Value来读取对象了, 需要使用@ConfigurationProperties 来读取, 具体实现如下:
package com.example.demo1.Test;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@ConfigurationProperties(prefix = "student")
@Component
public class Student {
private int id;
private String name;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
(注意这里的get和set方法不可以省略)
读取到yml中的配置文件之后, 就会注入此类对象. 然后再属性注入给下面的类:
package com.example.demo1.Test;
import jakarta.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
public class TestValue {
@Autowired
private Student student;
@PostConstruct
public void postConstruct() {
System.out.println(student.toString());
}
}
输出--
例如如下代码:
listTable:
name:
- zhangsan
- lisi
- wangwu
或者使用同一行的写法:
listTable2: {name: [zhangsan,lisi,wangwu]}
集合的读取和对象的读取是一样的, 同样是使用@ConfigurationProperties来读取, 具体实现如下:
@Component
@ConfigurationProperties(prefix = "listtable")
public class ListTable {
private List name;
public List getName() {
return name;
}
public void setName(List name) {
this.name = name;
}
}
通过属性注入给:
@Component
public class TestValue {
@Autowired
private ListTable listTable;
@PostConstruct
public void postConstruct() {
System.out.println(listTable.getName());
}
}
启动项目, 输出如下--
Spring Boot 中读取配置文件有以下 5 种方法:
面试突击75:SpringBoot 有几种读取配置文件的方法? - 掘金