spring boot 2.x properties 配置文件详解
先看 spring boot 2.x restful web应用
基于上述代码修改
-
Spring Boot 允许在一个配置文件中针对不同 Profile 进行配置
-
Spring Boot 在未指定 Profile 时默认为
default
-
Spring Boot 提供了
@ConfigurationProperties
注解,可以非常方便地把一段配置加载到一个 Bean 中 -
官方文档:https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.external-config
源码地址:https://github.com/langyastudio/langya-tech/tree/springboot/properties
读取配置文件
配置样例
这里使用 application.yml
yml 类型的配置文件,而不是 application.properties
ini 类型的配置文件。
langyastudio:
disk:
local:
root: /mnt/volume/edu/pms/
#只有在windows运行时才生效
#use for test on windows OS
win-root: Z:/volume/edu/pms/
#文件存储路径
root-file: ${langyastudio.disk.local.root}file/
#转码路径自动映射为mts/
root-mts: ${langyastudio.disk.local.root}mts/
#文件存储临时路径
root-tmp: ${langyastudio.disk.local.root}temp/upload/
#-图片-可直接浏览的文件大小10M
browse-img-max-size: 10485760
#-图片-可转码的文件大小20M
cvt-img-max-size: 20971520
# 最大文件大小,默认10M
max-size: 10485760
# 是否允许空文件:
allow-empty: false
# 允许的文件类型:
allow-types: jpg, png, gif
@Value
读取配置文件可以直接使用注解 @Value
,例如在某个类里需要获取 root
配置项,可使用 @Value
注入:
@RestController
@RequestMapping("/config")
public class ConfigController
{
@Value("${langyastudio.disk.local.root}")
String root;
@Value("${langyastudio.disk.local.root:/mnt/volume/edu/pms/}")
String root;
...
}
这里演示的是在 control 层注入配置项,在其他类文件中注入配置项需要使用 @Component
可以使用
${langyastudio.disk.local.root:/mnt/volume/edu/pms/}
设置缺省值
@ ConfigurationProperties
定义 Bean
为了更好地管理配置,Spring Boot 允许创建一个 Bean 直接注入一组配置项。可以首先定义一个 Java Bean,需要确保 Java Bean 的属性名称与配置一致即可:
@Data
@ConfigurationProperties(prefix = "langyastudio.disk.local")
public class DiskLocalConfig
{
private String root;
private String winRoot;
private String rootFile;
private String rootMts;
private String rootTmp;
private Integer browseImgMaxSize;
private Integer cvtImgMaxSize;
private Integer maxSize;
private Boolean allowEmpty;
private List<String> allowTypes;
}
注意到 @ConfigurationProperties(prefix = "langyastudio.disk.local")
表示将从配置项 langyastudio.disk.local
读取该项的所有子项配置并一一映射到属性字段中。
定义 ConfigurationPropertiesScan
表示对那些类文件进行属性扫描组装为 Bean。com.langyastudio.springboot.common.*
表示类所在的位置。
@ConfigurationPropertiesScan("com.langyastudio.springboot.common.*")
@Configuration
public class WebConfig implements WebMvcConfigurer
{
}
也可以使用
@Configuration
替代
使用配置项
@Autowired
DiskLocalConfig diskLocalConfig;
---- 实际数据
{
"root": "/mnt/volume/edu/pms/",
"winRoot": "Z:/volume/edu/pms/",
"rootFile": "/mnt/volume/edu/pms/file/",
"rootMts": "/mnt/volume/edu/pms/mts/",
"rootTmp": "/mnt/volume/edu/pms/temp/upload/",
"browseImgMaxSize": 10485760,
"cvtImgMaxSize": 20971520,
"maxSize": 10485760,
"allowEmpty": false,
"allowTypes": [
"jpg",
"png",
"gif"
]
}
这样就很方面的使用配置项,不需要使用一堆 @Value
配置环境profiles
即解决如何在研发、测试、上线等不同环境中使用不同的配置?通过 Profile 可以实现一套代码在不同环境启用不同的配置和功能。
我们可以三个配置文件:
- application.yml
- application-dev.yml
- application-pro.yml
application-dev.yml
或 application-pro.yml
配置文件会自动覆盖 application.yml
文件的已有配置项。
在 java 程序运行时,可以通过 --spring.profiles.active=dev
指定使用哪个配置文件,如要以 dev
环境启动,可输入如下命令:
$ java -Dspring.profiles.active=dev -jar xxx.jar
当然如果只使用一个配置文件,可以实现多文档分区,即同样的多配置功能。在一个 yml 文件中,通过 ---
分隔多个不同配置,根据 spring.profiles.active 的值来决定启用哪个配置。
此时可以通过 @Profile 指定不同的配置项组实现同样的效果。这里不做详细介绍
#公共配置
spring:
profiles:
# 指定使用哪个文档块
active: pro
---
spring:
profiles: dev
server:
port: 8080
---
spring:
profiles: pro
server:
port: 8081
yml 文件详解
以下内容来自网络,具体参考链接找不到了
什么是YAML
YAML是"YAML Ain’t a Markup Language"(YAML不是一种标记语言)的递归缩写。YAML的意思其实是:“Yet Another Markup Language”(仍是一种标记语言)。主要强度这种语音是以数据为中心,而不是以标记语音为重心,例如像 xml语言就会使用大量的标记。
YAML是一个可读性高,易于理解,用来表达数据序列化的格式。它的语法和其他高级语言类似,并且可以简单表达清单(数组)、散列表,标量等数据形态。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件等。
YAML 的配置文件后缀为 .yml,例如 Springboot 项目中使用到的配置文件 application.yml 。
基本语法
- YAML使用可打印的Unicode字符,可使用UTF-8或UTF-16。
- 数据结构采用键值对的形式,即 键名称: 值,注意冒号后面要有空格。
- 每个清单(数组)成员以单行表示,并用短杠+空白(- )起始。或使用方括号([]),并用逗号+空白(, )分开成员。
- 每个散列表的成员用冒号+空白(: )分开键值和内容。或使用大括号({ }),并用逗号+空白(, )分开。
- 字符串值一般不使用引号,必要时可使用,使用双引号表示字符串时,会转义字符串中的特殊字符(例如\n)。使用单引号时不会转义字符串中的特殊字符。
- 大小写敏感
- 使用缩进表示层级关系,缩进不允许使用tab,只允许空格,因为有可能在不同系统下tab长度不一样
- 缩进的空格数可以任意,只要相同层级的元素左对齐即可
- 在单一文件中,可用连续三个连字号(—)区分多个文件。还有选择性的连续三个点号(…)用来表示文件结尾。
- ‘#’ 表示注释,可以出现在一行中的任何位置,单行注释
- 在使用逗号及冒号时,后面都必须接一个空白字符,所以可以在字符串或数值中*加入分隔符号(例如:5,280 或 http://www.wikipedia.org)而不需要使用引号。
数据类型
-
标量(scalars):单个的、不可再分的值
-
对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
-
数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
标量
标量是最基础的数据类型,不可再分的值,他们一般用于表示单个的变量,有以下七种:
- 字符串
- 布尔值
- 整数
- 浮点数
- Null
- 时间
- 日期
# 字符串
string.value: Hello!我是陈皮!
# 布尔值,true或false
boolean.value: true
boolean.value1: false
# 整数
int.value: 10
int.value1: 0b1010_0111_0100_1010_1110 # 二进制
# 浮点数
float.value: 3.14159
# 科学计数法
float.value1: 314159e-5
# Null,~ 代表null
null.value: ~
# 时间,时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区
datetime.value: !!timestamp 2021-04-13T10:31:00+08:00
# 日期,日期必须使用ISO 8601格式,即yyyy-MM-dd
date.value: !!timestamp 2021-04-13
对象
我们知道单个变量可以用键值对,使用冒号结构表示 key: value,注意冒号后面要加一个空格。可以使用缩进层级的键值对表示一个对象,如下所示:
person:
name: 陈皮
age: 18
man: true
数组
可以用短横杆加空格 -开头的行组成数组的每一个元素,如下的address字段:
person:
name: 陈皮
age: 18
man: true
address:
- 深圳
- 北京
- 广州
也可以使用中括号进行行内显示形式,如下:
person:
name: 陈皮
age: 18
man: true
address:
[深圳, 北京, 广州]
如果数组字段的成员也是一个数组,可以使用嵌套的形式,如下:
person:
name: 陈皮
age: 18
man: true
address: [深圳, 北京, 广州]
twoArr:
-
- 2
- 3
- 1
-
- 10
- 12
- 30
如果数组成员是一个对象,则用如下两种形式形式:
childs:
-
name: 小红
age: 10
-
name: 小王
age: 15
文本块
如果你想引入多行的文本块,可以使用|符号,注意在冒号 : 和 | 符号之间要有空格。
person:
name: |
Hello Java!!
I am fine!
Thanks! GoodBye!
它和加双引号的效果一样,双引号能转义特殊字符:
person:
name: "Hello Java!!\nI am fine!\nThanks! GoodBye!"
显示指定类型
有时我们需要显示指定某些值的类型,可以使用 !(感叹号)显式指定类型。!单叹号通常是自定义类型,!!双叹号是内置类型,例如:
# 指定为字符串
string.value: !!str HelloWorld!
# !!timestamp指定为日期时间类型
datetime.value: !!timestamp 2021-04-13T02:31:00+08:00
内置的类型如下:
- !!int:整数类型
- !!float:浮点类型
- !!bool:布尔类型
- !!str:字符串类型
- !!binary:二进制类型
- !!timestamp:日期时间类型
- !!null:空值
- !!set:集合类型
- !!omap,!!pairs:键值列表或对象列表
- !!seq:序列
- !!map:散列表类型
引用
引用会用到 &锚点符合和 星号符号,&用来建立锚点,<< 表示合并到当前数据, 用来引用锚点。
xiaohong: &xiaohong
name: 小红
age: 20
dept:
id: D15D8E4F6D68A4E88E
<<: *xiaohong
上面最终相当于如下:
xiaohong:
name: 小红
age: 20
dept:
id: D15D8E4F6D68A4E88E
name: 小红
age: 20
还有一种文件内引用,引用已经定义好的变量,如下:
base.host: https://chenpi.com
add.person.url: ${base.host}/person/add
推荐阅读
-
详解基于Spring Boot/Spring Session/Redis的分布式Session共享解决方案
-
详解使用Jenkins部署Spring Boot项目
-
详解spring boot使用@Retryable来进行重处理
-
Spring Boot实战教程之自动配置详解
-
详解spring-boot集成elasticsearch及其简单应用
-
Spring boot跨域设置实例详解
-
Spring boot中@Conditional和spring boot的自动配置实例详解
-
Spring Boot Web应用程序配置详解
-
详解spring-boot下如何满足多生产环境中个性化定制功能
-
spring boot开发遇到坑之spring-boot-starter-web配置文件使用教程