全局配置文件能够对一些默认配置值进行修改,在SpringBoot中使用一个application.properties或者application.yaml作为全局配置文件,该文件一般存放到src/main/resource目录中,也可以存放到类路径的config中,一般选择resource存放
application.properties与application.yaml的区别:
1、加载优先级:application.properties配置文件的优先级要高于application.yaml的优先级,也就是说如果两个配置都有相同的配置项,则application.properties会覆盖application.yaml里的配置值
2、文件格式不同:application.yaml的层级关系更为直观,通过缩进式控制层级关系
例如,在application.properties文件中配置Tomcat的端口号为8083的写法是server.port=8083,而在application.yaml中的写法是
server: port: 8083二、测试使用全局配置文件配置属性值
1、编写实体类Pet和Person
public class Pet {
private String type;
private String name;
//省略属性getter和setter方法
//省略toString方法
}
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
@Component//用于将Person类作为Bean注入Spring容器中
@ConfigurationProperties(prefix = "person")//将配置文件以person开头的属性注入该类中
public class Person {
private Integer id;
private String name;
private List hobby;
private String[] familly;
private Map map;
private Pet pet;
//省略属性getter和setter方法
//省略toString方法
}
2、在全局配置文件application.properties/application.yaml(二选一即可)中配置属性值
在编写配置文件时,由于Person对象是我们自定义的,所以SpringBoot无法识别给出书写提示,为了出现代码提示效果,在使用@ConfigurationProperties注解进行配置文件属性值注入时,可以在pom文件中添加一个配置处理器依赖
org.springframework.boot spring-boot-configuration-processortrue
#properties格式 #对实体类对象Person进行属性设置 person.id=1 person.name=Tom person.familly=father,mother person.hobby=play,read person.map.k1=k1Value person.map.k2=k2Value person.pet.name=kity person.pet.type=cat
#yaml格式
person:
# 一、Value值为普通数据类型(如数字、字符串、布尔值等)key:(空格)value
id: 1
name: Tom
# 二、value值为数组或单列集合
# 行内式写法,[]可省略
hobby: [play,read]
# 缩进式写法
# 缩进式第一种写法(-(空格)Value)
# hobby:
# - play
# - read
# 缩进式第二种写法(直接赋值并使用英文逗号隔开属性值)
# hobby:
# play,
# read
familly: [father,mother]
# 三、value值为Map集合或者对象
# map行内式写法,且{}不可省略,同时注意k1:(空格)k1Value以及map:(空格)中的空格不要漏掉,属性间用英文逗号隔开
# map: {k1: k1Value,k2: k2Value}
# map缩进式写法
map:
k1: k1Value
k2: k2Value
pet: {type: cat, name: hellokitty}
yaml格式说明:
一、Value值为普通数据类型(如数字、字符串、布尔值等)key:(空格)value
name: (空格)Tom
二、value值为数组或单列集合
1、行内式写法,[]可省略
hobby:(空格) [play,read]
2、缩进式第一种写法(-(空格)Value)
hobby:
- (空格)play
- (空格)read
3、缩进式第二种写法(直接赋值并使用英文逗号隔开属性值)
hobby:
play,
read
三、value值为Map集合或者对象
1、map行内式写法,且{}不可省略,
同时注意k1:(空格)k1Value以及map:(空格)中的空格不要漏掉,属性间用英文逗号隔开
map: (空格){k1:(空格) k1Value,k2: (空格)k2Value}
2、map缩进式写法
map: k1:(空格)k1Value k2:(空格)k2Value
3、编写测试类
import com.chen.domain.Person;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class Demo01ApplicationTest {
@Autowired
private Person person;
@Test
public void test(){
System.out.println(person);
}
}
4、运行结果
三、配置文件的属性值注入1、使用@ConfigurationProperties注解进行批量注入
上述案例就是使用@ConfigurationProperties注解进行批量注入。需要注意的是,使用该注解时,要保证配置文件中的属性与对应的实体类的属性名要一致,否则无法正确获取并注入属性,同时属性还要提供setter方法
2、使用@Value注解进行单个注入
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
@Component//用于将Person类作为Bean注入Spring容器中
public class Person {
// @Value("${person.id}")
@Value("#{5*2}")//使用SpEL表达式注入属性值
private Integer id;
@Value("${person.name}")
private String name;
private List hobby;
private String[] familly;
private Map map;
private Pet pet;
//省略属性getter和setter方法
//省略toString方法
}
运行测试类
@ConfigurationProperties与@Value两种注解对比
| @ConfigurationProperties | @Value | |
|---|---|---|
| 框架 | SpringBoot自带的 | Spring自带的 |
| 功能 | 批量注入配置文件中的属性值 | 单个注入 |
| setter方法 | 需要提供 | 不需要提供 |
| 复杂类型属性注入(如集合、对象、数组) | 支持 | 不支持 |
| 松散绑定 | 支持 | 不支持 |
| JSR303数据校验 | 支持,在实体类的属性中引入校验类型即可 | 不支持 |
| SpEL表达式 | 不支持 | 支持 |
项目结构



