SpringBoot使用一个全局的配置文件,Spring允许两种类型的配置文件
- application.properties
- application.yml
配置文件的作用,修改springboot自动配置的默认值。
yml语法格式
SpringBoot中推荐使用properties或Yaml来进行配置,对于较复杂的配置结构,yaml优于properties
基本语法
- 使用缩进表示层级关系
- 缩进时不允许使用tab键,只允许使用空格
- 缩进的空格数目不重要,但是同级的元素缩进空格必须相同
- 大小写敏感
支持的数据结构
- 对象:键值对的集合
在表示对象的时候由两种写法多行或者一行行
person:
name: csdn
age: 10
person: {name: csdn,age: 10}
注意k: v冒号和v之间一定要一个空格
- 数组(list,set):一组按次序排列的值
数组用- 值表示数组的一个元素
numbers:
- one
- two
- three
- four
行内写法
numbers: [one,two,three,four]
- 字面量(数字、字符串、布尔之类的):单个的、不可再分的值
字符串默认不用加上单引号或者双引号
“”:双引号不会转义字符串里面的特殊字符 name: “666\n666” 结果就是666换行666
‘’:单引号会对内容进行转义 /n输出就是/n
实例
languages:
- Ruby
- Perl
- Python
websites:
YAML: yaml.org
Ruby: ruby-lang.org
Python: python.org
Perl: use.perl.org
使用配置文件配置类
创建一个值bean
package com.example.demo.bean;
import java.util.List;
import java.util.Map;
/**
还有一种方式就是使用@Value进行属性值的注入
**/
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private Integer age;
private boolean gender;
private Map<String,Object> map;
private List<Object> list;
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", gender=" + gender +
", map=" + map +
", list=" + list +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public boolean isGender() {
return gender;
}
public void setGender(boolean gender) {
this.gender = gender;
}
public Map<String, Object> getMap() {
return map;
}
public void setMap(Map<String, Object> map) {
this.map = map;
}
public List<Object> getList() {
return list;
}
public void setList(List<Object> list) {
this.list = list;
}
}
这里引入了 @Component @ConfigurationProperties两个注解
@Component 作用:表明这个类需要被组件扫描器扫描到并实例化对象到IOC容器,简单的说就是将注解的类丢给容器
@ConfigurationProperties 作用:将配置文件中配置的每一个属性的值映射到组件中,告诉springboot将本类中的所有属性和配置文件中相关的配置进行绑定。其中prefix用于指定绑定配置文件中那个属性
@ConfigurationProperties使用前提就是注解的类必须在容器中,因此使用@Component与其配合
在引入@ConfigurationProperties时Idea可能会提示
点击Open Documentation进入官方发现需要我们引入一个依赖
字面意思就是@ConfigurationProperties 注解过的类在配置yaml文件时会非常轻松,说人话就是配置的时候会自动提示
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
导入配置以后需要重新启动springboot程序才会生效
配置配置文件
下面两种方式二选一即可
yaml方式
server:
port: 8081
person:
name: jack
age: 20
gender: true
map: {k1: v1,k2: v2,k3: v3}
list:
- 1
- 2
- 3
- 4
- 5
properties方式
server.port=8080
person.age=20
person.list=[2,2,2,2]
person.gender=false
person.map.K1=2
person.map.k2=2
person.name=Jack
注意:如果使用properties配置中有中文且结果出现乱码那么就需要修改idea的文件编码
测试
在完成上述操作之后,启动spring boot程序 ,类对象中的属性值就会默认从配置文件中映射。我们可以在单元测试里进行测试
@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {
@Autowired
private Person person;
@Test
public void contextLoads() {
System.out.println(person);
}
}
可以发现结果正确输出了。
@Value
在给类属性注入值时除了使用@ConfigurationProperties进行批量注入时,也可以通过@Value单个进行注入
// 使用配置文件中的项进行赋值
@Value("${person.name}")
private String name;
// 直接赋值
@Value("20")
private String age;
@Value和@ConfigurationProperties对比
@Value | @ConfigurationProperties | |
---|---|---|
松散语法 | 不支持 | 支持 |
sqel | 支持 | 不支持 |
JSR303数据校验 | 不支持 | 支持 |
复杂类型封装 | 不支持 | 支持 |
如果某个业务逻辑中需要获取一下配置文件中的某项值可以使用@Value,
针对不同环境使用不同的配置文件
在实际开发项目中,会涉及到开发环境、测试环境、生产环境等不同环境会使用不同的配置,如果切换一个环境就对配置文件进行更改十分不妥,因此可以采用多个配置文件的方式来解决这个问题。
具体操作是将每个环境的参数写在不同的配置文件中,使用哪个环境就在主配置文件中通过spring.profiles.active设置即可。
在Spring Boot中多环境配置文件名需要满足application-{profile}.yml(或者.properties)的格式,其中{profile}对应你的环境标识,比如:
application-dev.yml:开发环境
application-test.yml:测试环境
application-prod.yml:生产环境
栗子:
主配置文件内容