SpringBoot的配置文件
- Spring Boot 使用一个全局配置文件,放置在 src/main/resources 目录或类路径的 /config 下;
- application.properties
语法:key = value
- application.yml
语法:key: value
- application.properties
- yml 是 YAML(YAML Ain’t Markup Language)不是一个标记语言;
- yaml配置和 properties 可以同时配置!
- properties的优先级要大于yaml
6.1 YML
-
YML配置以 数据为中心
-
基本语法
- 键值对形式
key: value
(冒名后面必需要有空格) - 空格,缩进,大小写严格区分
- 键值对形式
-
字符串说明 双引号转义生效,单引号转义不生效
name: "yao\sang" 结果: yao sang
name: 'yao\sang' 结果: yao\sang
-
对象&map
- 正常写法
employee: username:"小张" age:20 sex:true
- 一行写法(json)
employee: {username: "小张",age: 20}
-
数组与list
- 正规写法
hobbys: - music - song - basketball
- 一行写法
hobbys: [music,song,basketball]
6.2 配置文件注入值
在SpringBoot底层所有配置类都使用的是 @ConfigurationProperties!
yml注入数据
- 准备相应的类
/**
* @ConfigurationProperties 告诉SpringBoot将配置文件中对应属性的值,映射到这个组件类中,进
* 行一一绑定
* prefix = "emp":配置文件中的前缀名,哪个前缀与下面的所有属性进行一一映射
*/
@Component
@Data
@ConfigurationProperties(prefix="employee")
public class Employee {
private String name;
private Integer age;
private Date bornDate;
private Boolean sex;
private Map map;
private List list;
private Department department;
}
@Data
public class Department {
private String name;
private String address;
}
- 完成配置
application.yml
employee:
name: "小东"
age: 20
bornDate: 1998/08/23
sex: true
map: {k1: v1,k2: v2}
list: [23,45,7]
department:
name: xx
address: dee
- 使用springboot测试类
@SpringBootTest
class Springboot01HelloApplicationTests {
@Autowired
private Employee employee;
@Test
void contextLoads() {
System.out.println(employee);
}
}
- 导入配置文件处理器,然后重新运行测试类,在编写配置文件时就会提示
<!--导入提示信息的配置文件-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
传统的properties配置使用以下配置
@PropertySource("classpath:user.properties")
properties 配置文件注入数据
- application.properties加入数据
employee.age=6
employee.name=yao
employee.born-date=2009/07/12
employee.map.k1=value1
employee.map.k2=value2
employee.list=34,56,78
employee.department.name=IT部
employee.department.address=四川
- 运行后我们可以看到这里出现了乱码问题,解决方案如下
@Value 和 @ConfigurationProperties 的比较
- 使用 @Value 获取值
@Component
@Data
//@ConfigurationProperties(prefix="employee")
public class Employee {
@Value("${employee.name}")
private String name;
@Value("#{10*2}")
private Integer age;
private Date bornDate;
@Value("true")
private Boolean sex;
private Map map;
private List list;
private Department department;
}
- @Value 与 @ConfigurationProperties 获取值的区别
@ConfigurationProperties | @Value | 案例 | |
---|---|---|---|
功能 | 批量注入 | 单个指定 | |
松散绑定 | 支持 | 不支持 | last_name == lastName last-name == lastName |
SpEL | 不支持 | 支持 | #{10*2} |
复杂类型封装 | 支持 | 不支持 | employee.list |
JSR303数据校验 | 支持 | 不支持 |
6.3 加载指定配置文件
加载局部配置文件@PropertySource
@ConfigurationProperties
默认所有的数据都从application配置文件
中获取,这样操作会导致这个配置文件太过于臃肿,我们可以把这个东西放到局部的配置文件中去
- 新建一个
employee.properties
文件
employee.age=6
employee.name=yao
employee.born-date=2009/07/12
employee.map.k1=value1
employee.map.k2=value2
employee.list=34,56,78
employee.department.name=IT部
employee.department.address=四川
- 类上加上指定配置
@Component
@Data
//指定到相应的文件中去获取数据
@PropertySource({"classpath:employee.properties"})
@ConfigurationProperties(prefix="employee")
public class Employee {
private String name;
private Integer age;
private Date bornDate;
private Boolean sex;
private Map map;
private List list;
private Department department;
}