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 配置:
application-prod.properties 配置:
而在*.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