Spring Profiles 提供了一套隔离应用配置的方式,它允许我们通过定义不同的 profiles 来提供不同组合的配置。在不同的环境中,启动应用时可以通过选择激活某组特定的 profiles 来适应运行时环境,以达到在不同的环境可以使用相同的一套程序代码。

1. 使用 @Profiles 创建 profiles

Spring 提供了@Profiles注解,用于创建 profiles 配置。
你可以在@Component(@Service@Repository) 或@Configuration注解标注的类中使用它。

1
2
3
4
5
public interface AuthorityService {
boolean hasRole(String role);
}
1
2
3
4
5
6
7
8
9
10
@Service
@Profile("dev")
public class DevAuthorityServiceImpl implements AuthorityService {
@Override
public boolean hasRole(String role) {
return true;
}
}
1
2
3
4
5
6
7
8
9
10
@Service
@Profile("prod")
public class ProdAuthorityServiceImpl implements AuthorityService {
@Override
public boolean hasRole(String role) {
return role == "admin";
}
}

1.1 设置默认的 profiles

@Profile注解中,可以通过使用关键字default将当前的配置设置为默认的 profiles。Spring Boot 在启动时默认就会来加载此 profiles 配置。

1
2
3
4
5
6
7
8
9
10
@Service
@Profile({"dev", "default"})
public class DevAuthorityServiceImpl implements AuthorityService {
@Override
public boolean hasRole(String role) {
return true;
}
}

2. 使用属性配置文件创建 profiles

我们可以按照约定,将项目的配置文件以application-{profile}.{properties|yml}的方式命名来创建 profiles 配置。

application-test.properties 配置:

1
custom.env = test-env

application-prod.properties 配置:

1
custom.env = prod-env

而在*.yml配置文件中,我们可以通过使用---分隔符在同一个文件创建多个 profile 配置:

1
2
3
4
5
6
7
8
9
spring:
profiles: test
custom:
env: test-env
---
spring:
profiles: prod
custom:
env: prod-env

3. 激活 profiles

当我们配置了多组不同的 profiles 后,我们可以非常灵活的有选择性的激活它们,而那些未被激活的 profiles 配置,则不会被加载。

3.1 通过配置文件激活

application.properties 配置示例:

1
spring.profiles.active = dev, test

application.yml 配置示例:

1
2
3
4
5
spring:
profiles:
active:
- dev
- test

3.2 通过命令行激活

终端在启动 Spring Boot 应用的时候可以使用-Dspring.profiles.active参数激活 profiles 配置。

1
$ java -jar -Dspring.profiles.active="dev, test" xxxx.jar

3.3 通过 @ActiveProfiles 注解激活

这种方式仅适用于单元测试,@ActiveProfiles是由spring-test提供的。

1
2
3
4
5
6
7
8
9
10
11
@RunWith(SpringRunner.class)
@SpringBootTest
@ActiveProfiles({"dev", "test"})
public class ApplicationTest {
@Test
public void testProfiles() {
}
}

3.4 通过 setAdditionalProfiles 激活

在 Spring Boot 启动类中,可以通过调用SpringApplication.setAdditionalProfiles(...)来激活一组 profiles 配置。

1
2
3
4
5
6
7
8
9
10
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication application = new SpringApplication(Application.class);
application.setAdditionalProfiles("dev", "test");
application.run(args);
}
}

3.5 通过 setActiveProfiles 激活

在 Spring Boot 启动类中,可以通过调用ConfigurableEnvironment.setActiveProfiles(...)来激活一组 profiles 配置。

1
2
3
4
5
6
7
8
9
10
11
12
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication application = new SpringApplication(Application.class);
ConfigurableEnvironment environment = new StandardEnvironment();
environment.setActiveProfiles("dev", "test");
application.setEnvironment(environment);
application.run(args);
}
}

4. 组合 profiles 配置

使用spring.profiles.include属性可以将多个不同的 profiles 有效的组合到一起:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
spring:
profiles:
active: dev-test
---
spring:
profiles: test
custom:
env: test-env
---
spring:
profiles: prod
custom:
env: prod-env
---
spring.profiles: dev-test
spring:
profiles:
include:
- dev
- test

示例项目开发环境:Java-8、Maven-3、IntelliJ IDEA-2017、Spring Boot-1.5.2.RELEASE
完整示例项目链接:spring-boot-profiles-sample
参考文档文献链接:spring-boot-features-profiles