这是我参与8月更文挑战的第7天,活动详情查看:8月更文挑战
前言
springboot使用一个全局配置文件,配置文件为application.properties
和application.yml
,一般使用yaml格式
。通过配置文件可以修改springboot的默认值,实现定制化。
一、yaml格式
1.1 yaml语法
- 使用缩进表示层级关系。
- 缩进时不允许使用tab键,只允许使用空格。
- 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可。
- 大小写敏感。
1.2 三种数据结构
- 对象:键值对集合
- 数组:一组按次序排列的值
- 字面量:单个的、不可再分的值
字面量:普通值(数字、字符串、布尔)
字符串默认不用加上单引号或者双引号
"":双引号,不会转移字符串里面的特殊字符,特殊字符表示本身的特殊含义。
name: "zhangsan \n lisi" ==输出=> zhangsan 换行 lisi '':单引号,会转义特殊字符,特殊字符最终作为普通字符串。 name: 'zhangsan \n lisi' ==输出=> zhangsan \n lisi
name:
zhangsan lisi
对象、Map
# 普通写法
friends:
lastname: zhangsan
age: 20
# 行内写法
friends: {lastname: zhangsan,age: 20}
数组(List、Set)
# 普通写法
pets:
- cat
- dog
- pig
# 行内写法
pets: {cat, dog, pig}
二、值绑定
@ConfigurationProperties(prefix="person")
,将application.yml配置文件中的每一个属性值,映射到这个组件中。prefix:表示属性前缀。
@ConfigurationProperties(prefix="person")
public class Person {
private String lastName;
private Integer age;
private Boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
// getter setter
}
// application.yml
person:
lastName: hello
age: 18
boss: false
birth: 2021/08/07
maps: {k1:v1,k2:v2}
lists:
- lisi
- zhaoliu
dog:
name: 小狗
age: 3
@Value
中可以为字面量
、${key}
从环境变量、配置文件取值、#{SpEL}
支持SpEL。只有这个组件是容器中的组件时,才能实现绑定功能。
@Component
public class Person {
@Value("${person.last-name}")
private String lastName;
@Value("#{11*2}")
private Integer age;
@Value("true")
private Boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
// getter setter
}
配置文件处理器:配置文件进行绑定有提示
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
@ConfigurationProperties | @Value | |
---|---|---|
功能 | 批量注入配置文件中的属性 | 单独指定 |
松散绑定 | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
三、导入其它配置
application.yml是属于springboot的默认配置文件,那么不可能将所有的配置写入一个文件中,导致配置文件过大。所以我们需要将一些配置写入其它文件中,那么如何使其它配置文件生效?
- PropertySource:导入其它配置文件
ImportResource
:导入spring
的配置文件,让配置文件里面的内容生效。目前使用@Configuration
和@Bean
PropertySource(value = {"classpath:person.properties"})
ImportResource(value = {"locations:beans.xml"})
四、配置文件占位符
- 可以在配置文件中引用前面配置过的属性(优先级前面配置过的这里都能用)
${app.name:默认值}
来指定找不到属性时的默认值
spring.name=app
app.description=${spring.name} is a Spring Boot Appilcation
- RandomValuePropertySource:配置文件中可以使用随机数
${random.value}、${random.int}、${random.long}、${random.int(10)}、${random.int[1024,65536]}
五、Profile
Profile是spring对不同环境提供不同配置功能的支持,可以通过激活、指定参数等方式快速切换环境
1. 多profile文件形式
- application-{profile}.properties
eg: application-dev.properties、application-prod.properties
2. 多profile文档模式
3. 激活方式
- 命令行 --spring.profiles.active=dev
- 配置文件 spring.profiles.active=dev
- jvm参数 -Dspring.profiles.active=dev
六、配置文件加载位置
springboot启动会扫描以下位置的application.properties或application.yml文件作为springboot的默认配置文件
file: ./config/
file:./
classpath:/config/
classpath:/
以上按照优先级从高到低
的顺序,所有位置的文件都会被加载,高优先级配置
内容会覆盖低优先级配置
内容。我们也可以通过配置spring.config.location
来改变默认配置。
七、外部配置加载顺序
- 命令行参数
- 来自于
java:comp/env
的JNDI属性 - java系统属性(System.getProperties())
- 操作系统环境变量
- RandomValuePropertySource配置的
random.*
属性值 - jar包
外部的
application-{profile}.properties或application.yml(带spring.profile)配置文件 - jar包
内部的
application-{profile}.properties或application.yml(带spring.profile)配置文件 - jar包
外部的
application.properties或application.yml(不带spring.profile)配置文件 - jar包
内部的
application.properties或application.yml(不带spring.profile)配置文件 - @Configuration注解类上的@PropertySource
- 通过SpringApplication.setDefaultProperties指定的默认属性