Java Spring Boot 注解 profile 区分环境

配置文件约定

  • application.yaml 公共配置
  • application-dev.yaml 开发环境配置
  • application-test.yaml 测试环境配置
  • application-prod.yaml 生产环境配置

可以在 application.yaml 配置文件中激活

1
2
3
spring:
profiles:
activate: prod

也可以在一个 yaml 文件中完成所有的 profile 配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
spring:
profiles:
activate:
- prod
- dev
---
# dev 配置
spring:
profiles: dev
# 简略配置
---
# dev 配置
spring:
profiles: test
# 简略配置

在代码中区分环境

修饰类

1
2
3
4
5
6
7
8
9
10
@Configuration
@Profile("production")
public class JndiDataConfig {

@Bean(destroyMethod="")
public DataSource dataSource() throws Exception {
Context ctx = new InitialContext();
return (DataSource) ctx.lookup("java:comp/env/jdbc/datasource");
}
}

修饰注解

1
2
3
4
5
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Profile("production")
public @interface Production {
}

修饰方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Configuration
public class AppConfig {

@Bean("dataSource")
@Profile("development")
public DataSource standaloneDataSource() {
return new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.HSQL)
.addScript("classpath:com/bank/config/sql/schema.sql")
.addScript("classpath:com/bank/config/sql/test-data.sql")
.build();
}

@Bean("dataSource")
@Profile("production")
public DataSource jndiDataSource() throws Exception {
Context ctx = new InitialContext();
return (DataSource) ctx.lookup("java:comp/env/jdbc/datasource");
}
}

激活使用

插件

1
spring-boot:run -Drun.profiles=prod

Jar 激活

1
java -jar -Dspring.profiles.active=prod *.jar

在Java中使用

1
System.setProperty("spring.profiles.active", "test");
1
2
3
4
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.getEnvironment().setActiveProfiles("development");
ctx.register(SomeConfig.class, StandaloneDataConfig.class, JndiDataConfig.class);
ctx.refresh();