# 常用配置

### YAML基本使用

YAML 是 "YAML Ain't a Markup Language"（YAML 不是一种标记语言）的递归缩写。在开发的这种语言时，YAML 的意思其实是："Yet Another Markup Language"（仍是一种标记语言）。

#### 基本语法

* 大小写敏感
* 使用缩进表示层级关系
* 缩进不允许使用tab，只允许空格
* 缩进的空格数不重要，只要相同层级的元素左对齐即可
* '#'表示注释

#### 数据类型

YAML 支持以下几种数据类型：

* 对象：键值对的集合，又称为映射（mapping）/ 哈希（hashes） / 字典（dictionary）
* 数组：一组按次序排列的值，又称为序列（sequence） / 列表（list）
* 纯量（scalars）：单个的、不可再分的值

```
dog:
  name: xiaohuang
  age: 3
  happy: false
  lists: [girl,dog,code]
  maps: {k1: v1,k2: v2}
  birth: 2020/12/05
  cat:
    name: xiaosan
    age:3
```

#### 配置注入

```
@ConfigurationProperties(prefix = "dog")
```

需要引入spring-boot-configuration-processor包，否则会爆红

```
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>
```

yaml中还支持占位符的写法：

```
age: ${random.int}
```

### JSR303校验

Springboot中可以用`@validated`来校验数据，如果数据异常则会统一抛出异常，方便异常中心统一处理。

```
@Component  //注册bean
@ConfigurationProperties(prefix = "dog")
@Validated  //数据校验
public class Dog {
    @Email(message = "邮箱格式不正确")
    private String name;
    private Integer age;
}
```

使用Validated须引入`spring-boot-starter-validation`包

```
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>
```

#### 常用验证类型

![](https://937995404-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MMTM8NYe0uekudlCMKb%2F-MNkpX5U86u2lqbD5dhG%2F-MNkpyNXy8RgSFER1QCz%2Fimage.png?alt=media\&token=6dbd2ae2-b029-419e-b976-80783247eaf4)

### 多环境切换

`profile`是Spring对不同环境提供不同配置功能的支持，可以通过激活不同的环境版本，实现快速切换环境

**多配置文件：**

我们在主配置文件编写的时候，文件名可以是 application-{profile}.properties/yml , 用来指定多个环境版本；

例如：

application-test.properties 代表测试环境配置

application-dev.properties 代表开发环境配置

但是Springboot并不会直接启动这些配置文件，它**默认使用application.properties主配置文件**；

我们需要通过一个配置来选择需要激活的环境：

```
#比如在配置文件中指定使用dev环境，我们可以通过设置不同的端口号进行测试；
#我们启动SpringBoot，就可以看到已经切换到dev下的配置了；
spring.profiles.active=dev
```

**yaml的多文档块：**

和properties配置文件中一样，但是使用yml去实现不需要创建多个配置文件，更加方便了 !

```
server:
  port: 8081

spring:
  profiles:
    active: dev
---
server:
  port: 8082
spring:
  profiles: dev


---
server:
  port: 8083
spring:
  profiles: test
```

{% hint style="info" %}
如果yml和properties同时都配置了端口，并且没有激活其他环境 ， 默认会使用properties配置文件的！
{% endhint %}

**配置文件加载位置：**

&#x20;外部加载配置文件的方式十分多，我们选择最常用的即可，在开发的资源文件中进行配置！

* 优先级1：项目路径下的config文件夹配置文件
* 优先级2：项目路径下配置文件
* 优先级3：资源路径下的config文件夹配置文件
* 优先级4：资源路径下配置文件

优先级由高到底，高优先级的配置会覆盖低优先级的配置

### 引入外部配置文件信息

和传统的ssm的方式一样，通过@value的注解去获取properties/yml文件中的内容 如果在yml文件中需要编写大量的自定义的配置，并且具有统一的前缀时，可以采用下方方式

```
@ConfigurationProperties(prefix = "aliyun")
@Component
@Data
public class AliyunProperities {
private String  xxxx;

...
}
```

```
aliyun:
  xxxx: xxxxxxxx
  ...
```

```
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
```
