Spring Boot基于Profile多文档配置

我们在日常基于SpringBoot或SpringCloud开发过程中会有不同的服务器环境比如:开发环境、测试环境、预发布环境和生产环境等,而不同的环境又要求会有一些不同的配置内容。而Profile提供了一种分离应用配置方法,让配置仅在某些具体的环境中才能被激活生效。

1.默认的Profile

当我们不对项目做任何配置的情况下,SpringBoot会使用默认的Profiledefault,这个可以从一开始的启动日志中看到:

No active profile set, falling back to 1 default profile: "default"

2.激活Profile

使用spring.profiles.active参数指定要激活的Profile,比如在application.yml配置文件中指定激活dev

这里新建的是spring boot的Maven项目,在resources目录下准备三个文件,application.yml、application-dev.yml、application-prod.yml

其中application.yml配置内容如下:

spring:
  profiles:
    active: dev

application-dev.yml配置内容如下:

spring:
  cofig:
    activate:
      on-profile: dev

myTest:
  user:
    name: 张三

application-prod.yml配置内容如下:

spring:
  cofig:
    activate:
      on-profile: prod

myTest:
  user:
    name: 李四

我这里新建了一个Controller用于测试,这里使用@Value注入了myTest.user.name用于测试不同环境是否可以正常切换。

@RestController
public class DemoController {
    @Value("${myTest.user.name}")
    private String userName;

    @RequestMapping("/myTest")
    public String myTest(){
        return userName;
    }
}

当我们设置application.yml里spring.profiles.active为dev时,请求测试接口返回结果如下图:

启动日志中可以看到已经正常切换到dev了

The following 1 profile is active: "dev"

请求测试接口返回结果

这时,我们修改application.yml里spring.profiles.active为prod,重新启动项目,再次请求测试接口。

启动日志中可以看到已经切换到prod了

The following 1 profile is active: "prod"

这时我们请求测试接口看返回结果:

内容也已经成功更新为“李四”了。

3.Profile分组

Profile还提供了分组的功能,有时候会出现多个文件需要一起作为一组进行加载的情况,为了便于区分,这里对之前的文件稍作调整。

新增两个作为一组的配置文件application-dev1.yml和application-dev2.yml

application-dev1.yml配置内容如下:

spring:
  cofig:
    activate:
      on-profile: dev

myTest:
  user:
    name1: 张三

application-dev2.yml配置内容如下:

spring:
  cofig:
    activate:
      on-profile: dev

myTest:
  user:
    name2: 王五

修改application.yml文件,新增spring.profiles.group配置,其中dev对应active要开启的组名,dev1和dev2作为dev下的组成员配置文件

spring:
  profiles:
    active: dev
    group:
      dev:
        - dev1
        - dev2

测试接口也做了调整,输出不同配置中的内容

@RestController
public class DemoController {
    @Value("${myTest.user.name1}")
    private String userName1;

    @Value("${myTest.user.name2}")
    private String userName2;

    @RequestMapping("/myTest")
    public String myTest(){
        return String.format("dev1中userName1: %s dev2中userName2: %s",userName1,userName2);
    }
}

启动项目后,启动日志中我们会看到

The following 3 profiles are active: "dev", "dev1", "dev2"

请求测试接口

分别取到了dev组下dev1和dev2中的配置内容。