SpringBoot 教程之 profile

一个应用为了在不一样的环境下工做,经常会有不一样的配置,代码逻辑处理。Spring Boot 对此提供了简便的支持。html

关键词: @Profilespring.profiles.activejava

区分环境的配置

properties 配置

假设,一个应用的工做环境有:dev、test、prodgit

那么,咱们能够添加 4 个配置文件:github

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

applcation.properties 文件中能够经过如下配置来激活 profile:spring

spring.profiles.active = test
复制代码

yml 配置

与 properties 文件相似,咱们也能够添加 4 个配置文件:sql

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

applcation.yml 文件中能够经过如下配置来激活 profile:bash

spring:
 profiles:
 active: prod
复制代码

此外,yml 文件也能够在一个文件中完成全部 profile 的配置:app

# 激活 prod
spring:
 profiles:
 active: prod
# 也能够同时激活多个 profile
# spring.profiles.active: prod,proddb,prodlog
---
# dev 配置
spring:
 profiles: dev

# 略去配置

---
spring:
 profiles: test

# 略去配置

---
spring.profiles: prod
spring.profiles.include:
 - proddb
 - prodlog

---
spring:
 profiles: proddb

# 略去配置

---
spring:
 profiles: prodlog
# 略去配置
复制代码

注意:不一样 profile 之间经过 --- 分割spring-boot

区分环境的代码

使用 @Profile 注解能够指定类或方法在特定的 Profile 环境生效。测试

修饰类

@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");
    }
}
复制代码

修饰注解

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Profile("production")
public @interface Production {
}
复制代码

修饰方法

@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");
    }
}
复制代码

激活 profile

插件激活 profile

spring-boot:run -Drun.profiles=prod
复制代码

main 方法激活 profile

--spring.profiles.active=prod
复制代码

jar 激活 profile

java -jar -Dspring.profiles.active=prod *.jar
复制代码

在 Java 代码中激活 profile

直接指定环境变量来激活 profile:

System.setProperty("spring.profiles.active", "test");
复制代码

在 Spring 容器中激活 profile:

AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.getEnvironment().setActiveProfiles("development");
ctx.register(SomeConfig.class, StandaloneDataConfig.class, JndiDataConfig.class);
ctx.refresh();
复制代码

源码

完整示例:源码

使用方法:

mvn clean package
cd target
java -jar -Dspring.profiles.active=prod sbe-core-profile.jar
复制代码

引伸和引用

引伸

参考

相关文章
相关标签/搜索