1 Spring Boot 配置文件
Spring Boot 使用一个全局的配置文件。配置文件有两种类型:application.properties
或者application.yml
。配置文件放置在src/main/resources
目录下。配置文件名是固定的。
配置文件的作用:修改 Spring Boot 自动配置的默认值。
1.1 YAML 语法
YAML是以数据为中心,而不是以置标语言为重点 ,比xml更适合做配置文件。
1.1.1 基本语法
key: value
:表示一对键值对。注意:key 和 value 之间必须要有空格。
以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的。
属性和值是大小写敏感的。
1 | server: |
1.1.2 值的写法
一、【字面量】:普通的值(数字、字符串、布尔)。
字面量直接来写,字符串默认不用加上单引号或者双引号。
""
:双引号,不会转义字符串里面的特殊字符。特殊字符原样输出。
''
:单引号,会转义字符串里面的特殊字符。
二、【对象、Map(属性和值)】:
值是对象的时候,还是用key: value
的形式,表示值。
1 | friend: |
行内写法:
1 | friend: {firstName: liang, lastName: enhao, age: 18} |
三、【数组(List、Set)】:
用- 值
的方式表示数据中的一个元素。
1 | pets: |
行内写法:
1 | pets: [cat, dog, pig] |
1.2 配置文件值获取: @ConfigurationProperties
1.2.1 使用方法
首先,YAML配置文件属性如下:
1 | person: |
要想配置文件的值和bean的值一一绑定,需要使用@ConfigurationProperties
。该注解默认从全局配置文件application.properties/application.yml
中获取值。
1 |
|
通过属性prefix
指定前缀,只要是指定前缀的key,Spring Boot 就会将该前缀key的value映射到标注了@ConfigurationProperties
注解的bean中。
导入配置文件处理器,在编写配置文件时就可以有提示了。
1
2
3
4
5
6 > <dependency>
> <groupId>org.springframework.boot</groupId>
> <artifactId>spring-boot-configuration-processor</artifactId>
> <optional>true</optional>
> </dependency>
>
1.2.2 @ConfigurationProperties 和 @Value 区别
@ConfigurationProperties
和 @Value
都可以获取到配置文件中的值,但他们有一些区别:
@ConfigurationProperties | @Value | |
---|---|---|
功能 | 批量注入配置文件中的属性 | 一个一个指定 |
松散绑定(松散语法) | 支持 | 不支持 |
SpEL(#{} ) |
不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装(Map,List) | 支持 | 不支持 |
松散绑定:对属性名称匹配规则:
- 标准的:
person.lastName
- 松散语法:
person.last-name
JSR303数据校验:可以使用
@Validated
进行数据校验。
1
2
3
4
5
6
7
8 >
> "person") (prefix =
>
> public class Person {
>
> private String email;
> }
>
校验必须时email格式的。
总结:我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value
注解。如果我们专门编写一个JavaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties
。
1.3 加载指定配置文件:@PropertySource
由于@ConfigurationProperties
注解默认是从全局配置文件application.properties/application.yml
中获取值的。如果要从其他配置文件中获取值时,就需要使用@PropertySource
,来读取指定的配置文件,其属性value
可以指定一个数据值,读取多个配置文件的值。
1 |
|
读取类路径下
person.properties
配置文件。并将其映射到bean中。
1.4 导入Spring的配置文件:@ImportResource
Spring Boot 项目里面没有Spring的配置文件,我们自己编写的Spring配置文件不能自动的识别。如果想让Spring的配置文件生效,就需要使用@ImportResource
。将其标注在一个配置类上。
感觉没啥用 ( ̄▽ ̄)”
1 |
|
1.5 配置文件占位符
YAML和properties两种形式的配置文件都支持占位符。
一、【占位符获取随机数】:
1 | ${random.value}、${random.int}、${random.long} |
二、【占位符获取之前配置的值,如果没有可以用:
指定默认值】:
1 | person.last-name=enhao ${random.uuid} |
2 配置文件加载位置
Spring Boot 启动的时候会扫描以下位置的application.properties
或者application.yml
文件作为默认配置文件。
file:/config/
file:./
classpath:/config/
classpath:/
以上优先级由高到低,所有位置的文件都会被加载,高优先级配置内容会覆盖低优先级配置内容。
我们还可以通过spring.config.location
来改变默认的配置文件的位置。
通常是项目打包好后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置。指定配置文件和默认加载的这些配置文件共同起作用形成互补配置。
3 外部配置加载顺序
SpringBoot也可以从以下位置加载配置; 优先级从高到低;高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置。
- 命令行参数 。
- 来自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
指定的默认属性 。
着重关注1、6、7、8、9。
由jar包外向jar包内进行寻找。优先加载带profile。
4 Profile 多环境支持
Profile 是 Spring 对不同环境提供不同配置的支持,可以通过激活、指定参数等方式快速切换环境。
4.1 方式一:多个profile文件方式
主配置文件使用格式为:application-{profile}.properties
。编写不同环境的配置文件。
默认使用的是application.properties
文件。
可以使用spring.profile.active
来激活指定的profile。
4.2 方式二:YAML多文档块方式
在YAML配置文件中,使用---
来将配置文件划分为多个文档块。
1 | spring: |
使用spring.profiles
来指定该文档块的名称。
可以在第一个文档块中使用spring.profiles.active
指定激活的文档块。
4.3 激活profile
一、【方式一:spring.profile.active
】:
在配置文件中使用spring.profile.active
来激活指定的proflie。
1 | spring.profile.active=dev |
二、【方式二:命令行方式】:
--spring.profiles.active=dev
三、【方式三:虚拟机参数】:
-Dspring.profiles.active=dev