springboot之profile

定义profile

  • 形式1: application-{profile}.(yml|properties)
  • 形式2: 在yaml文件中通过spring.profiles配置定义某个yaml文本段所属的profile (不推荐)
    1
    2
    3
    4
    5
    6
    7
    8
    server:
    port: 9000
    ---
    # 该段yaml描述的profile是dev
    spring:
    profiles: dev
    server:
    port: 9001

激活profile

可在配置文件中通过spring.profiles.activespring.profiles.include来激活配置.

  • spring.profiles.active用来配置哪些profile是激活的. 可配置多个profile, 用逗号隔开, 也可以用yaml的数组形式
  • spring.profiles.includespring.profiles.active的基础上可以再激活一些profile. 配时方式同上.
  • 这两条配置如果有多条, 则最后一条会覆盖前一条. (include配置并不是将每次include的profile合并进来)

此配置也可用命令行形式传入, 用来覆盖配置文件的配置: --spring.profiles.active=dev,hsqldb

选择profile

  • 任何@Component, @Configuration均可以被@Profile标记, 用来限制其在特定的profile加载

    1
    2
    3
    4
    5
    @Configuration
    @Profile("production")
    public class ProductionConfiguration {
    // ...
    }
  • 通过Environment获取当前的profile

优先级

在springboot官方的优先级定义的基础上添加了springcloud配置的优先级:

完整优先级定义(上层优先级高, 会覆盖下层):

  • ~/.spring-boot-devtools.properties (devtools需要为启用状态)
  • @TestPropertySource (测试时)
  • @SpringBootTest#propertiesattribute属性 (测试时)
  • 命令行传入的参数, 例如--spring.foo=a --bar=b
  • 来自SPRING_APPLICATION_JSON的属性
  • ServletConfig的init参数
  • ServletContext的init参数
  • Java系统属性 (System.getProperties()中的属性, 或者通过-D传入的属性)
  • 系统环境变量System.getenv()
  • RandomValuePropertySource
  • (springcloud) 配置中心
  • jar包外的application-{profile}.properties, 或者yml
  • jar包内的application-{profile}.properties, 或者yml
  • jar包外的application.properties, 或者yml
  • jar包内的application.properties, 或者yml
  • (springcloud) bootstrap-{profile}.(properties|yml)
  • (springcloud) bootstrap.(properties|yml)
  • @Configuration类的@PropertySource注解
  • 通过SpringApplication.setDefaultProperties设置的默认变量.

参考文档

boot features profiles
howto change configuration depending on the environment

0%