计算机上有数以千计的配置⽂件,⽐如C:\Users, C:\Windows⽂件夹,以及各种 *.config, *.xml ⽂件,配置⽂件主要是为了解决硬编码(俗称:代码写死)带来的问题, 把可能会发⽣改变的信息,放在⼀个集中的地⽅,当我们启 动某个程序时,应⽤程序从配置⽂件中读取数据,并加载运⾏.
比如我们就经常需要修改项目的端口号,因为 Tomcat 默认使用的 8080 端口号很可能已经被其他进程使用
SpringBoot 在创建项⽬时, 就已经帮我们创建了配置⽂件,图中的 application.properties 就是SpringBoot 项目的配置文件
我们点开配置文件,在其中添加如下的代码,我们便修改了当前项目所用的端口号
server.port=9090
Spring Boot 配置⽂件有以下三种:
• application.properties
• application.yml
• application.yaml
其中,yml 为 yaml 的简写, 实际开发中出现频率最⾼. yaml 和yml 的使⽤⽅式⼀样,所以只需要了解一个即可
注意:理论上讲 .properties 和 .yml 可以并存在于⼀个项⽬中,当 .properties 和 .yml 并存时,两个配置文件都会生效. 如果配置⽂件内容有冲突(配置项相同), 则以 .properties 为主, 也就是 .properties 优先级更⾼,但实际的业务当中,我们通常会采取⼀种统⼀的配置⽂件格式,这样可以更好的维护(降低故障率).
properties 是以键值对的形式配置的,key 和 value 之间是以"="连接的,如:
# 配置项⽬端⼝号
server.port=8080
#配置数据库连接信息
spring.datasource.username=root
spring.datasource.password=root
(PS:⼩技巧:配置⽂件中使⽤“#”来添加注释信息。)
. properties 配置文件的缺点:由下面的配置信息我们可以看出来 spring.datasource 在重复出现,properties 配置⽂件中会有很多的冗余的信息
#配置数据库连接信息
spring.datasource.username=root
spring.datasource.password=root
如果在项⽬中,想要主动的读取配置⽂件中的内容,可以使⽤ @Value 注解使⽤"${}"的格式读取,如下代码所示:
在 . properties 配置文件中设置一个配置项
mykey.key = bite
通过 @Value 注解,把配置项的 key 值添加到"${}"中,便将配置项的 value 值赋值给属性 key
public class PropertiesController {
@Value("${mykey.key}")
private String key;
}
yml 是树形结构的配置⽂件,它的基础语法是"key: value", key 和 value 之间使⽤英⽂冒号加空格的⽅式组成,空格不可省略
如下所示:
spring:
datasource:
url: jdbc:mysql://127.0.0.0:3306/dbname?characterEncoding=utf8&useSSL=false
username: root5
password: root
很明显 yml 结构的配置文件优化了properties 配置⽂件中会有很多冗余信息的缺点
# 字符串
string.value: Hello
# 布尔值,true或false
boolean.value: true
boolean.value1: false
# 整数
int.value: 10
# 浮点数
float.value: 3.14159
# Null,~代表null
null.value: ~
# "" 空字符串
#直接后⾯什么都不加就可以了, 但这种⽅式不直观, 更多的表⽰是使⽤引号括起来
empty.value: ""
yml 读取配置的⽅式和 properties 相同,使⽤ @Value 注解即可,实现代码如下:
在 . yml 配置文件中设置一个配置项
string:
hello: bite
通过 @Value 注解,把配置项的 key 值添加到"${}"中,便将配置项的 value 值赋值给属性 hello,注意:配置项的 key 要写为 properties 的格式
public class ReadYml {
@Value("${string.hello}")
private String hello;
}
字符串默认不⽤加上单引号或者双引号,如果加英⽂的单双引号可以表⽰特殊的含义。假设在 application.yml 中配置如下信息:
string:
str1: Hello \n Spring Boot.
str2: 'Hello \n Spring Boot.'
str3: "Hello \n Spring Boot."
获取配置项 string.str1 ,string.str2, string.str3 的值如下所示:
我们可以看出,当什么都不加和加单引号时,就表示字符串,特殊字符没有特殊含义,但加上双引号特殊字符就有特殊含义,比如 \n 表示换行
我们还可以在 yml 中配置对象,如下配置:
student:
id: 13
name: Java
age: 18
这个时候就不能⽤ @Value 来读取配置中的对象了,此时要使⽤另⼀个注解@ConfigurationProperties 来读取,具体实现如下:
@ConfigurationProperties(prefix = "student")
@Component
@Data
public class Student {
private int id;
private String name;
private int age;
}
上述代码,在 @ConfigurationProperties 注解中设置属性 prefix = "student" ,表示将前缀为 student 配置对象的内容赋值给 Student 类的对象,搭配上 Spring 的 IoC 思想(推荐看Spring IoC & DI 使⽤),添加 @Component 注解,将 Student 类的对象交给 Spring 管理,于是含有配置对象内容的 Student 类的对象就交给了 Spring 管理
通过 @Autowired 注解来进行获取,代码如下:
public class StudentController {
@Autowired
private Student student;
}
如上代码,加上 @Autowired 注解,表示从 Spring 那里获取 Student 类型的对象,注入到 StudentController 类的 student 属性中
yml 可以配置⽂件也可以配置 list 集合,如下所⽰:
dbtypes:
name:
- mysql
- sqlserver
- db2
集合的读取和对象⼀样,也是使⽤ @ConfigurationProperties 来读取的,具体实现如下:
@Component
@ConfigurationProperties(prefix = "dbtypes")
@Data
public class ListConfig {
private List name;
}
上述代码,在 @ConfigurationProperties 注解中设置属性 prefix = "dbtypes" ,表示将前缀为 dbtypes 配置集合的内容赋值给 ListConfig 类的对象,搭配上 Spring 的 IoC 思想(推荐看Spring IoC & DI 使⽤),添加 @Component 注解,将 ListConfig 类的对象交给 Spring 管理,于是含有配置对象内容的 ListConfig 类的对象就交给了 Spring 管理
通过 @Autowired 注解来进行获取,代码如下:
public class ReadYml {
@Autowired
private ListConfig listConfig;
}
如上代码,加上 @Autowired 注解,表示从 Spring 那里获取 ListConfig 类型的对象,注入到 ReadYml 类的 listConfig 属性中
yml 配置⽂件也可以配置 map,如下所⽰:
maptypes:
map:
k1: kk1
k2: kk2
k3: kk3
Map的读取和对象⼀样,也是使⽤ @ConfigurationProperties 来读取的,具体实现如下:
@Component
@ConfigurationProperties(prefix="maptypes")
@Data
public class MapConfig {
private HashMap map;
}
解释和上面都相同,这里不赘述了
通过 @Autowired 注解来进行获取,代码如下:
public class ReadYml2 {
@Autowired
private MapConfig mapConfig;
}
1. 可读性⾼,写法简单, 易于理解
2. ⽀持更多的数据类型, 可以简单表达对象,数组, List,Map等数据形态.
3. ⽀持更多的编程语⾔,不⽌是Java中可以使⽤,在Golang, Python, Ruby, JavaScript中也可以使⽤
1. 不适合写复杂的配置⽂件
2. 对格式有较强的要求(在 value 前一定要加空格,是key+冒号+空格+value 的格式)