目录
前言
一、properties配置文件
1.1、语法格式
1.2、读取配置文件
1.3、缺点分析
2、yml配置文件
2.1、yml语法
2.1.1、注意:value值的单双引号
2.2、yml配置读取
2.3、yml配置的不同数据类型
2.4、yml配置对象
2.5、yml配置集合
3、面试:properties 和 yml 配置文件有什么区别?
4、不同环境中的配置文件
前言
Spring Boot中的配置文件是是干什么的?主要是用来写 “系统配置文件(例如端口号设置,数据库连接设置)” 和 “用户自定义配置文件”,书写格式有两种“.properties” 和 “.yml” ,接下来我们就一起来了解以下这两种格式吧~
一、properties配置文件
properties 配置文件是最早的配置文件格式,也是 Spring Boot 项目的默认配置文件(两种格式的配置文件中,properties的优先级最高,会先被加载)。
1.1、语法格式
properties 是以键值对的形式进行配置的,在 key 和 value 之间通过“=”连接,如下代码:
# 配置端口号
server.port=8080
# 配置数据库连接信息
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=1234
Ps:
1.配置文件是通过"#"来添加注释信息的;
2.每一个关键字之间的"."号是只层级关系;
3.注释后面可以不加空格,这是个人习惯~
1.2、读取配置文件
在 Spring Boot 项目中,可以使用 @Value 注解通过“${}”的格式来读取配置文件信息,如下:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
@Component
public class ReadProperties {
@Value("${server.port}")
private String port;
@PostConstruct
public void PostConstruct() {
System.out.println("port = " + port);
}
}
执行结果如下:
Ps:被Component注解的对象在 Spring Boot 启动时会被注入到框架中,注入到框架中的时候会执行 @PostConstruct 初始化方法。
1.3、缺点分析
例如刚刚在配置文件中连接数据库的数据就存在一些冗余信息,如下:
另外还存在一些中文编码问题...
想要解决如上问题,就需要使用yml配置文件了~
2、yml配置文件
yml格式可读性、写法简单、便于理解,和JSON语言类似,并且支持更多的数据类型,例如清单(数组)、散列表、标记等数据形态,最重要的一点是它支持更多的编程语言(因为企业中每个部门干的活不一样,开发使用的语言也可能不相同),如Java、Golang、PHP、Python、Ruby、 JavaScript、Perl等。
2.1、yml语法
yml的语法类似于键值对的写法,基础语法是:“key: value”,值得注意的一点是,value的前面还有一个空格,这个空格是不可省略的。
例如使用yml格式配置文件,连接数据库:
#配置端口号
server:
port: 8888
# 连接数据库
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8
username: root
password: 1234
2.1.1、注意:value值的单双引号
在yml中,不加引号和单引号效果相同(都会将特殊字符自动转义成原始字符),双引号则区别于前者(不会自动转义,例如 \n 在双引号里就表示换行)
如下Spring Boot代码:
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 PostConstruct() {
System.out.println(str1);
System.out.println(str2);
System.out.println(str3);
}
}
如下yml配置文件
string:
str1: hello \n world!
str2: 'hello \n world!'
str3: "hello \n world!"
通过@Value注解分别读取,执行结果如下:
2.2、yml配置读取
yml 读取配置的⽅式和 properties 相同,使⽤ @Value 注解即可,如下代码:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
@Component
public class ReadYml {
@Value("${server.port}")
private String port;
@PostConstruct
public void PostConstruct() {
System.out.println("yml port: " + port);
}
}
执行结果如下:
2.3、yml配置的不同数据类型
yml可以配置很多的数据类型,甚至是null,如下代码:
# 字符串
string.value: Hello
# 布尔值,true或false
boolean.value: true
boolean.value1: false
# 整数
int.value: 10
int.value1: 0b1010_0111_0100_1010_1110 # ⼆进制
# 浮点数
float.value: 3.14159
float.value1: 314159e-5 # 科学计数法
# Null,~代表null
null.value: ~
2.4、yml配置对象
在yml中配置对象,如下:
student:
id: 1
name: 周杰伦
age: 18
或者是使用行内写法:
student: {id: 1, name: 周杰伦, age: 18}
此时,在yml中,对象的读取就不能使用 @Value 注解了,而是要使用另一个注解 @ConfigurationProperties 来读取(此注解的参数是一个键值对形式,prefix = “yml中的对象名称”,或者参数直接写yml中对象的名称),并且这个注解需要搭配这个对象的实体类(1.属性名必须要以yml配置中的key值一致,2.必须有setter和getter方法,因为需要这两个方法初始化实体类对象),具体的代码如下:
实体类如下:
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@ConfigurationProperties(prefix = "student")
//或者直接写:@ConfigurationProperties("student")
@Component
@Data
public class Student {
private int id;
private String name;
private int age;
}
调用类代码如下:
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 PostConstruct() {
System.out.println(student);
}
}
执行结果如下:
注意事项:
2.5、yml配置集合
yml配置文件也可以配置list集合,如下:
student:
stu1:
- 周杰伦
- 林俊杰
- 薛之谦
或者使用行内写法,如下:
student: {stu1: [周杰伦,林俊杰,薛之谦]}
读取对象也是通过@ConfigurationProperties 来读取,如下:
实体类:
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.List;
@ConfigurationProperties("student")
@Data
@Component
public class ListStudent {
private List<String> stu1;
}
调用类:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
@Component
public class ReadListStudent {
@Autowired
private ListStudent listStudent;
@PostConstruct
public void PostConstruct() {
System.out.println(listStudent);
}
}
执行结果:
3、面试:properties 和 yml 配置文件有什么区别?
- properties是以 key=value 的形式配置的键值对类型的配置文件,yml则是以 key: value 类似JSON格式的树形配置方式进行配置,层级之间采用缩进,且value前的空格不可省略。
- properties 为早期并且默认的配置⽂件格式,但存在一定的冗余数据,使用yml可以很好的解决冗余问题。
- yml通用性更好,支持更多语言,如 Java、Go、Python 等,如果是云服务器开发,可以使⽤⼀份 配置⽂件作为 Java 和 Go 的共同配置⽂件。
- yml ⽀持更多的数据类型。
4、不同环境中的配置文件
实际的工作中,我们可能会面临两种环境,分别是“生产环境” 和 “开发环境”,而针对于这两种环境,我们需要使用不同的yml配置文件(假设以yml为例),一般我们命名为如下两种形式:
- application-dev.yml
- application-prod.yml
第一个是开发环境,第二个是生产环境。
Ps:文件的开头的 “application-”是固定的,在这后面的我们可以自定义。
那么我们该如何在 application.yml 中配置到底运行哪个环境呢?
通过如下代码即可任意写换(例如配置成dev开发环境):
spring:
profiles:
active: dev
Ps:一个配置文件中只能有一个spring关键字