### 1、环境切换

日常开发时，一般会有开发环境、预生产环境、生成环境等。开发时，可以定义不同环境的配置。环境配置文件的格式为："app-{env}.yml" 或 "app-{env}.properties" ，比如：


|  配置文件 | 说明 | 
| -------- | -------- |
| app.yml     | 应用主配置文件（必然会加载）     | 
| app-dev.yml      | 应用开发环境配置文件     | 
| app-pro.yml     | 应用生产环境配置文件     | 


通过环境切换，实现配置切换。


### 2、四种指定环境的方式


| 方式                                             | 示例                                                          | 备注     |
| ---------------------------- | ------------------------------------ | --- |
| (1) 主配置文件指定 "solon.env"  属性      | `solon.env: dev`                                             |  以 yml 为例     |
| | | |
| (2) 启动时用系统属性指定                     | `java -Dsolon.env=pro -jar demo.jar`                |       |
| (3) 启动时用启动参数指定                     | `java -jar demo.jar --env=pro`                        |       |
| (4) 启动时用系统环境变量指定               | `docker run -e 'solon.env=pro' demo_image`     | 以 docker 为例     |


提醒：

* 方式的编号越大，优先级越高
* 会（且只会）自动加载内部的资源文件："app-{env}.yml" 或 "app-{env}.properties"
* 后续被加载的配置文件，不支持再次指定环境

### 3、加载更多的配置

添加多个内部配置（在 app.yml 之外，添加配置加载）//v2.2.7 后支持

```yaml
solon.config.load:
  - "classpath:${solon.env}/jdbc.yml"  #可以是环境相关的
  - "classpath:${solon.env}/*.yml" #v2.7.6 后支持 * 表达式
  - "classpath:app-ds-${solon.env}.yml"     #可以是环境相关的
  - "classpath:app-auth_${solon.env}.yml"
  - "classpath:common/*.yml" #v2.7.6 后支持 * 表达式   #也可以环境无关的或者带目录的
  - "classpath:docs.yml"
```

### 4、通过代码加载更多的配置

在应用启动类加载配置

```java
//通过注解添加 （需要加在启动类上）
@Import(profiles = "classpath:demo.xml") 
public class App {
    public static void main(String[] args) {
        Solon.start(App.class, args, app -> {
            //启动时，通过接口添加
            app.cfg().loadAdd("app-jdbc-" + app.cfg().env() + ".yml");
            app.cfg().loadAdd("app-cache-" + app.cfg().env() + ".yml");
        });
    }
}
```

在模块插件里加载配置

```java
//在插件里，通过接口添加
public class DemoPlugin impl Plugin{
    @Override
    public void start(AppContext context){
         //一般用于添加模块内部的配置
        context.cfg().loadAdd("demo.xml") 
    }
}
```

直接注入到某个配置类

```java
@Inject("${classpath:demo.xml}")
@Configuration
public class DemoConfig {
    ...
}
```
