2019-07-31 17:39:13 +08:00
..
2019-01-08 17:02:55 +08:00
2019-07-31 17:39:13 +08:00

spring-boot-yml-profile

目录

一、项目结构
二、常用 yaml 语法讲解
        2.1 基本规则
        2.2 对象的写法
        2.3 map的写法
        2.3 数组的写法
        2.5 单双引号
        2.6 特殊符号
三、spring boot 与 yaml
        3.1 spring boot 支持使用 ${app.name} 引用预先定义的值
        3.2 spring boot 支持使用 ${random.xxx} 配置随机值
四、@ConfigurationProperties实现属性绑定
五、多配置文件
六、优先级的说明

正文

一、项目结构

二、常用 yaml 语法讲解

项目中的 yml 配置文件如下:

programmer:
  name: xiaoming-DEV
  married: false
  hireDate: 2018/12/23
  salary: 66666.88
  random: ${random.int[1024,65536]}
  skill: {java: master, jquery: proficiency}
  company: [baidu,tengxun,alibaba]
  school:
    name: unviersity
    location: shanghai

2.1 基本规则

  1. 大小写敏感
  2. 使用缩进表示层级关系
  3. 缩进长度没有限制,只要元素对齐就表示这些元素属于一个层级。
  4. 使用#表示注释
  5. 字符串默认不用加单双引号,但单引号和双引号都可以使用,双引号不会对特殊字符转义。
  6. YAML 中提供了多种常量结构包括整数浮点数字符串NULL日期布尔时间。

2.2 对象的写法

key: value

2.3 map的写法

# 写法一 同一缩进的所有键值对属于一个map
key: 
    key1: value1
    key2: value2

# 写法二
{key1: value1, key2: value2}

2.3 数组的写法

# 写法一 使用一个短横线加一个空格代表一个数组项
- a
- b
- c

# 写法二
[a,b,c]

2.5 单双引号

单引号和双引号都可以使用,双引号不会对特殊字符转义。

s1: '内容\n 字符串'
s2: "内容\n 字符串"

转换后:
{ s1: '内容\\n 字符串', s2: '内容\n 字符串' }

2.6 特殊符号

--- YAML 可以在同一个文件中,使用---表示一个文档的开始。

三、spring boot 与 yaml

3.1 spring boot 支持使用 ${app.name} 引用预先定义的值

appName: MyApp
appDescription: ${app.name} is a Spring Boot application

3.2 spring boot 支持使用 ${random.xxx} 配置随机值

my.secret: ${random.value}
my.number: ${random.int}
my.bignumber: ${random.long}
my.number.less.than.ten: ${random.int(10)}
my.number.in.range: ${random.int[1024,65536]}

四、@ConfigurationProperties实现属性绑定

@Component
@ConfigurationProperties(prefix = "programmer")
@Data
@ToString
public class Programmer {

    private String name;
    private int age;
    private boolean married;
    private Date hireDate;
    private float salary;
    private int random;
    private Map<String, String> skill;
    private List company;
    private School school;

}

Spring Boot 将环境属性绑定到@ConfigurationProperties beans 时会使用一些宽松的规则,称之为松散绑定。所以 Environment 属性名和 bean 属性名不需要精确匹配。常见的示例中有用的包括虚线分割比如context-path 绑定到 contextPath将环境属性转为大写字母比如PORT 绑定 port

需要注意的是 @Value 是不支持松散绑定的,所以建议除非有特殊的需求,否则在 ConfigurationPropertiesvalue 配置属性的时候最好都保持属性和变量的一致,以免造成不必要的勿扰。

五、多配置文件

多配置文件可以在同一个 yml 中使用 --- 分割为多个配置,或者遵循 application-xxx.yml 的方式命名拆分为多个文件,并在主配置文件 application.yml 中确定激活哪个配置文件,当然也可在命令行中确定,命令行的优先级大于配置文件。

# 配置文件中激活配置
spring:
  profiles:
    active: dev
# 命令行参数激活配置
--spring.profiles.active=dev

六、优先级的说明

Spring Boot 设计了一个非常特别的 PropertySource 顺序,以允许对属性值进行合理的覆盖,属性会以如下的顺序进行设值:

  1. home 目录下的 devtools 全局设置属性(~/.spring-boot-devtools.properties如果 devtools 激活)。
  2. 测试用例上的@TestPropertySource 注解。
  3. 测试用例上的@SpringBootTest#properties 注解。
  4. 命令行参数
  5. 来自 SPRING_APPLICATION_JSON 的属性(环境变量或系统属性中内嵌的内联 JSON
  6. ServletConfig 初始化参数。
  7. ServletContext 初始化参数。
  8. 来自于 java:comp/env 的 JNDI 属性。
  9. Java 系统属性System.getProperties())。
  10. 操作系统环境变量。
  11. RandomValuePropertySource只包含 random.*中的属性。
  12. 没有打进 jar 包的 Profile-specific 应用属性application-{profile}.properties 和 YAML 变量)
  13. 打进 jar 包中的 Profile-specific 应用属性application-{profile}.properties 和 YAML 变量)。
  14. 没有打进 jar 包的应用配置application.properties 和 YAML 变量)。
  15. 打进 jar 包中的应用配置application.properties 和 YAML 变量)。
  16. @Configuration 类上的@PropertySource 注解。
  17. 默认属性(使用 SpringApplication.setDefaultProperties 指定)。

这里做一下说明,上文第 12,14 点没有打进 jar 包的文件指的是在启动时候通过 spring.config.location 参数指定的外部配置文件,外部配置文件的优先级应该是大于 jar 中的配置文件。

对上面的配置中常用的规则可以精简如下:

命令行 > application-{profile}.yml > application.yml > 默认属性