SpringBoot中的配置文件
- 一、application.properties
- 二、application.yml
- 1、yaml基础语法
- 2、yaml支持的三种数据结构:
- 三、配置文件值注入
- (1)@Value
- (2)@ConfigurationProperties将属性注入到实体类中
- (3)@Value和@ConfigurationProperties的区别:
- (4)@PropertySource
- (5)@ImportResource
- 四、配置文件占位符
- 五、Profile
- (1)多profile文件形式:
- (2)yml的文档块模式
- (3)命令行的方式
- (4)虚拟机参数配置
- 六、配置文件加载位置
- SpringBoot全局配置文件有两种写法且配置文件名称是固定的,配置文件主要用来修改SpringBoot自动配置的默认值。
- 配置文件在
src/main/resources
目录或者类路径/config
下
一、application.properties
语法结构 :key=value
server.port=8080
二、application.yml
语法结构 :
key:
value
yml是YAML(YAML Ain’t Markup Language)语言的文件,以数据为中
心,比json、xml等更适合做配置文件。以前的配置文件,大多数都是使用xml来配置;比如一个简单的端口配置,我们来对比下yml和xml;
传统xml配置:
<server>
<port>8081<port>
</server>
yaml配置:(更加简洁,更能凸显出数据)
server:
prot: 8080
1、yaml基础语法
- 以缩进来控制层级关系,只要是左边对齐的一列数据都是同一个层级的。
- 属性和值的大小写十分敏感。
- 缩进时不允许使用Tab键,只允许使用空格,缩进的空格数目不重要。
- 冒号后面要跟空格来分开键值。
2、yaml支持的三种数据结构:
- 对象:键值对的集合
- 数组:一组按次序排列的值
- 字面量:单个的、不可再分的值
(1) 对象(或Map键值对)
#对象、Map格式
k:
v1:
v2:
对象的属性和值得关系,注意缩进;
student:
name: lisi
age: 3
写成一行:
student: {name: lisi,age: 3}
(2)数组(或 List、set )
用 -
值表示数组中的一个元素,比如:
pets:
- cat
- dog
- pig
写成一行:
pets: [cat,dog,pig]
(3)字面量
数字、字符串、布尔、日期
字符串
- 默认不使用引号
- 可以使用单引号或者双引号,单引号会转义特殊字符
-
“ ”
双引号,不会转义字符串里面的特殊字符 ;
比如 :name: “kuang \n shen” 输出 :kuang 换行 shen -
''
单引号,会转义特殊字符
比如 :name: ‘kuang \n shen’ 输出 :kuang \n shen
(4)文档分隔
多个文档用- - -
隔开
三、配置文件值注入
application.yml:
person:
name: lisi
age: 3
happy: false
birth: 2000/01/01
maps: {k1: v1,k2: v2}
lists:
- code
- girl
- music
dog:
name: 旺财
age: 1
配置文件值注入有两种方式@Value和@ConfigurationProperties。
(1)@Value
@Component
public class Person {
@Value("${person.name}")
private String name;
@Value("#{11*2}")
private Integer age;
@Value("true")
private Boolean happy;
}
(2)@ConfigurationProperties将属性注入到实体类中
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private Integer age;
private Boolean happy;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
}
@ConfigurationProperties
:将配置文件中配置的每一个属性的值,映射到这个组件中;告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定参数prefix = “person” : 将配置文件中的person下面的所有属性一一对应.
需要导入:
<!-- 导入配置文件处理器,配置文件进行绑定就会有提示,需要重启 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
(3)@Value和@ConfigurationProperties的区别:
@ConfigurationProperties | @Value | |
功能 | 批量注入配置文件种的属性 | 一个个注入 |
松散绑定 | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |
1)松散绑定:
如果配置文件中person的一个属性为firstName,那么松散绑定也就意味着在使用@ConfigurationProperties注入属性时,以下方式都是等价的:
person.firstName:
person.first-name:
person.first_name:
PERSON_FIRST_NAME:
2)SpEL:
@Value支持spring的表达式语言:
@Value("#{11*2}")
private Integer age;
3)JSR303校验
使用@ConfigurationProperties时支持JSR303数据校验,使用@Validated注解
@Component
@Validated
@ConfigurationProperties(prefix = "person")
public class Person {
@Email //name必须是邮箱格式
private String name;
}
4)复杂类型封装
@Component
public class Person {
@Value("${person.maps}")
private Map<String,Object> maps;
}
对于上面这样,使用@Value注入复杂类型的值,就会报错。
注意:
- 如果我们专门编写了一个JavaBean来和配置文件进行一一映射,就直接使用@configurationProperties
- 如果只是在应用中需要使用配置文件中的某项值,就直接使用@Value就好了。
(4)@PropertySource
- 可以使用
@PropertySource
,加载指定的配置文件,只能用于properties文件;
@PropertySource(value = "classpath:person.properties")
-
@configurationProperties
:默认从全局配置文件中获取值;
@ConfigurationProperties(prefix = "person")
(5)@ImportResource
导入Spring配置文件,并让内容生效。
@SpringBootApplication
@ImportResource(locations={"classpath:beans.xml"})
public class HellospringbootApplication {
public static void main(String[] args) {
SpringApplication.run(HellospringbootApplication.class, args);
}
}
四、配置文件占位符
配置文件还可以编写占位符${}
生成随机数,
person:
name: lisi${random.uuid} # 随机uuid
age: ${random.int} # 随机int
happy: false
birth: 2000/01/01
maps: {k1: v1,k2: v2}
hello: hello
lists:
- code
- girl
- music
dog:
name: ${person.hello:other}_旺财
age: 1
name: ${person.hello:other}_旺财
:如果person.hello存在则输出:hello对应的值,若不存在则输出othor。这里冒号指定的就是默认值。
五、Profile
Profile是Spring对不同环境提供不同配置功能的支持,可以通过激活、指定参数来快速切换环境。
(1)多profile文件形式:
格式:application-{profile}.properties/yml:
例如:
- application-dev.properties //开发环境
- application-test.properties //测试环境
- application-prod.properties //生产环境
默认使用application.properties中的配置,如果要激活某个环境就需要在默认配置文件application.properties/yml
中配置spring.profiles.active=dev
(2)yml的文档块模式
server:
port: 8081
spring:
profiles:
active: dev
---
server:
port: 8082
spring:
profiles: dev
---
server:
port: 8083
spring:
profiles: prod
(3)命令行的方式
1)在启动时,指定配置文件。
2)-jar的方式运行时指定配置文件
java -jar springBoot.jar --spring.profiles.active=prod
(4)虚拟机参数配置
六、配置文件加载位置
1、配置文件的默认加载位置
SpringBoot启动会扫描以下位置的application.properties或者
application.yml文件作为Spring boot的默认配置文件。
- file:./config/
- file:./
- classpath:/config/
- classpath:/
以上是按照优先级从高到低的顺序,高优先级配置内容会覆盖低优先级配置内容,且各配置文件的内容也会互补(会加载上面位置中所有的配置文件)。
注意:
- 1、2属于工程包下的配置文件,打jar包时并不会将它们打包进来,jar包文件中只会包含类路径下的配置文件3、4.
2、外部配置文件的加载
(1)项目打包好之后,我们也可以通过命令行参数的方式使用spring.config.location
来改变默认配置。
java -jar springboot.jar --spring.config.location=C:/application.properties
(2)命令行参数:多个参数时,中间可以用空格分开。
java -jar springboot.jar --server.port=8095
(3)也可以在jar包外部写配置文件:
- 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)配置文件