• SpringBoot 教程之 profile 的应用


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

    关键词: @Profilespring.profiles.active

    区分环境的配置

    properties 配置

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

    那么,我们可以添加 4 个配置文件:

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

    applcation.properties 文件中可以通过以下配置来激活 profile:

    spring.profiles.active = test
    

    yml 配置

    与 properties 文件类似,我们也可以添加 4 个配置文件:

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

    applcation.yml 文件中可以通过以下配置来激活 profile:

    spring:
      profiles:
        active: prod
    

    此外,yml 文件也可以在一个文件中完成所有 profile 的配置:

    # 激活 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 之间通过 --- 分割

    区分环境的代码

    使用 @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();
    

    示例源码

    示例源码:spring-boot-profile

    参考资料

  • 相关阅读:
    【BZOJ3261】— 最大异或和(可持久化0/1Trie)
    【ZJOI2007】—捉迷藏(动态点分治)
    【HNOI2010】-城市建设(动态最小生成树)
    【BOI2007】Mokia 摩基亚
    【BZOJ 3262】-陌上花开(CDQ分治+树状数组)
    Win64 驱动内核编程-24.64位驱动里内嵌汇编
    Win64 驱动内核编程-23.Ring0 InLineHook 和UnHook
    Win64 驱动内核编程-23.Ring0 InLineHook 和UnHook
    Win64 驱动内核编程-22.SHADOW SSDT HOOK(宋孖健)
    Win64 驱动内核编程-22.SHADOW SSDT HOOK(宋孖健)
  • 原文地址:https://www.cnblogs.com/jingmoxukong/p/10151785.html
Copyright © 2020-2023  润新知