
在平时开发时,会发现公司的项目会不同的环境使用到不同的配置。如本地,测试,预发布,发布等环境,像数据库这些都要使用到不同的配置。如果只有一个配置文件,发布到不同环境的时候都要去修改一遍那简直就是遭罪,那么,如何实现SpringBoot根据需要去加载不同的配置文件?
项目构建
SpringBoot提供简单配置能够让我们进行不同配置文件的加载。
创建Maven项目
这里简单的常见一个用户类和控制器模仿一般的逻辑,获取用户的信息。
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.68</version>
        </dependency>
    </dependencies>
用户类
public class User {
    private String username;
    private String address;
    private String email;
    private String id;
    private String message;
    public User(String id) {
        this.username = "张三";
        this.address = "亚历山大";
        this.email = "sing@example.com";
        this.id = id;
    }
}
控制器
@RestController
public class Controller {
    @Value("${custom.value}")
    private String customValue;
    @RequestMapping(value = "/userInfo/{id}",method = RequestMethod.GET)
    public JSON getUserInfo(@PathVariable("id")String id){
        User user = new User(id);
        user.setMessage(customValue);
        return JSONObject.parseObject(JSON.toJSONString(user));
    }
}
启动器
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class,args);
    }
}
说明:这里利用Restful风格的请求方式,获取用户的个人信息,从配置文件中获取message复制给用户,然后以JSON的形式返回给页面。
这里来看配置配置文件
application.yml
server:
  port: 8000  #指定端口号
  
custom:
  value: This Is Application   #自定义的value值(message)
利用postman请求发现没有问题,<font color=red>注意看属性message的值</font>。

进行多文件配置
application-dev.yml
server:
  port: 8001 #指定端口号
  
custom:
  value: This Is Application-dev  ##自定义的value值(message)
application-uat.yml
server:
  port: 8002  #指定端口号
custom:
  value: This Is Application-uat  #自定义的value值(message)
application-pro.yml
server:
  port: 8003 #指定端口号
custom:
  value: This Is Application-pro  #自定义的value值(message)
如果要启动使用不同的配置配置文件name就需要在application.yml中添加额外的配置
spring:
 profiles:
    active: uat
这样在启动的时候就使用的是uat的配置了,启动查看message信息。

我们可以看到message的信息就是application-uat.yml里面配置的,同时还能注意到<font color=red>当我们application.yml和application-uat.yml进行相同的配置是,SpringBoot会优先使用指定配置profiles的值。如果没有才会去application.yml里面找。
补充
Maven打包
那么说到了SpringBoot加载不同的配置文件启动,那么不妨说一下Maven根据不同环境用不同的配置文件打包。
在pom.xml中添加配置:
    <profiles>
        <profile>
            <id>dev</id>    <!--为env起一个名字-->
            <properties>
                <env>dev</env>
            </properties>
        </profile>
        <profile>
            <id>uat</id>
            <properties>
                <env>uat</env>
            </properties>
            <activation>
                <activeByDefault>true</activeByDefault>  <!--默认加载uat,实际根据环境需求-->
            </activation>
        </profile>
        <profile>
            <id>pro</id>
            <properties>
                <env>pro</env>
            </properties>
        </profile>
    </profiles>
    <!--build标签中添加如下的配置>
    <resources>
        <resource>
            <directory>src/main/resources</directory>   <!--指定文件下-->
            <filtering>true</filtering>      <!--动态配置-->
            <excludes>       <!--去除多余的文件-->
                <exclude>application.yml</exclude>
                <exclude>application-dev.yml</exclude>
                <exclude>application-pro.yml</exclude>
                <exclude>application-uat.yml</exclude>
            </excludes>
        </resource>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>    <!--动态配置  ${env}-->
            <includes>     <!--包含加载的文件(env  默认加载uat 具体看配置)-->
                <include>application-${env}.yml</include>
                <include>application.yml</include>
            </includes>
        </resource>
    </resources>
配置完成后依次执行命令mvn clean ; mvn package进行打包,maven会根据你的配置去打包相应的文件,打包完成后如图包含的配置文件。
[图片上传失败...(image-5331af-1599820046417)]
使用postman去请求得到的结果,如图:











