应用配置的加载主要分了六个层级，其加载规则为：

* 越静态的越前面
* 越动态的越后面（<mark>以配置“键”为单位，后面加载的会盖掉前面加载的</mark>）

具体顺序为：

### （L1）主配置文件


* 应用属性配置

即内部的 "app.yml"、"app.properties"。

* 应用环境属性配置

即内部带环境标记的 "app-xxx.yml"、"app-xxx.properties"（如："app-dev.yml"，"app-pro.yml"）。


### （L2）内部资源扩展配置文件（注意前缀）


* 通过 "solon.config.load" 添加的资源配置文件

```yaml
solon.config.load:
  - "classpath:${solon.env}/jdbc.yml"
  - "classpath:${solon.env}/*.yml" #v2.7.6 后支持 * 表达式   #只加载内部文件
  - "file:common/*.yml" #v2.7.6 后支持 * 表达式              #只加载外部文件
  - "docs.yml"                                             #先加载外部文件；如果没有则加载内部文件
```

### （L3）外部本地扩展配置文件（额外再加）

一般把 “需要修改的内容” 提练为 “外部配置文件”。方便部署时修改！

* 通过 “solon.config.add” 添加的外部配置文件

```yaml
solon.config.add: "./demo.yml" #会加载 jar 边上的 demo.yml 配置文件（多个用","隔开）
```

或者在启动时指定：

```
java -jar demo.jar --solon.config.add=./demo.yml
java -Dsolon.config.add=./demo.yml -jar demo.jar
```


### （L4）动态配置

* 启动参数

```
java -jar demo.jar -debug=1
```

* 系统属性

```
java -Dsolon.config.add=./demo.yml -jar demo.jar
```

* 环境变量（比如编排容器时）

```yaml
services:
  demoapi:
    image: demo/demoapi:1.0.0
    container_name: demoapi
    environment:
      - solon.stop.safe=1
      - TZ=Asia/Shanghai
    ports:
      - 8080:8080
```

"solon" 开头的环境变量，会被框架同步到系统属性（System::getProperties）与应用属性（Solon::cfg）。

* 代码设定（启动之前）

```java
public class App {
    public static void main(String[] args) {
        System.setProperty("solon.config.add", "./demo.yml");
        System.setProperty("solon.stop.safe", "1");
        
        Solon.start(App.class, args);
    }
}
```


### （L5）启动初始化时接口加载的配置

* 加载配置文件

```java
Solon.start(App.class, args, app->{
    app.cfg().loadAdd("demo.yml");
});
```

* 加载环境变量（打包 docker 镜像时，非常方便）

```java
Solon.start(App.class, args, app->{
    //通过前缀加载环境变量
    app.cfg().loadEnv("demo.");
});
```


### （L6）云端配置（Solon Cloud Config）

* 以 [nacos-solon-cloud-plugin](/article/400)  为例：

```yaml
solon.cloud.nacos:
  config:
    load: "jdbc.yml,auth.yml"
```

