Spring Boot 使用Profile进行配置属性

      当应用程序需要部署到不同的运行环境时,一些配置细节通常会有所不同。比如,数据库连 接的细节在开发环境下和测试环境下就会不一样,在生产环境下又不一样。Spring Framework从 Spring 3.1开始支持基于Profile的配置。Profile是一种条件化配置,基于运行时激活的Profile,会使用或者忽略不同的Bean或配置类。

Spring Boot支持为application.properties和application.yml里的属性配置Profile。

      为了演示区分Profile的属性,假设你希望针对生产环境和开发环境能有不同的日志配置。在

生产环境中,你只关心WARN或更高级别的日志项,想把日志写到日志文件里。在开发环境中, 你只想把日志输出到控制台,记录DEBUG或更高级别。

而你所要做的就是为每个环境分别创建配置。那要怎么做呢?这取决于你用的是属性文件配 置还是YAML配置。

1. 使用特定于Profile的属性文件

如果你正在使用application.properties,可以创建额外的属性文件,遵循application-{profile}. properties这种命名格式,这样就能提供特定于Profile的属性了。

在日志这个例子里,开发环境的配置可以放在名为application-development.properties的文件 里,配置包含日志级别和输出到控制台:

logging.level.root=DEBUG

对于生产环境,application-production.properties会将日志级别设置为WARN或更高级别,并将 日志写入日志文件:

logging.path=/var/logs/
logging.file=BookWorm.log
logging.level.root=WARN

与此同时,那些并不特定于哪个Profile或者保持默认值(以防万一有哪个特定于Profile的配 置不指定这个值)的属性,可以继续放在application.properties里:

amazon.associateId=habuma-20
logging.level.root=INFO

2. 使用多Profile YAML文件进行配置

如果使用YAML来配置属性,则可以遵循与配置文件相同的命名规范,即创建application- {profile}.yml这样的YAML文件,并将与Profile无关的属性继续放在application.yml里。

但既然用了YAML,你就可以把所有Profile的配置属性都放在一个application.yml文件里。举 例来说,我们可以像下面这样声明日志配置:

logging:
  level:
    root: INFO
---
spring:
  profiles: development
logging:
  level:
    root: DEBUG
---
spring:
  profiles: production
logging:
  path: /tmp/
  file: BookWorm.log
  level:
    root: WARN

如你所见,这个application.yml文件分为三个部分,使用一组三个连字符(---)作为分隔符。 第二段和第三段分别为spring.profiles指定了一个值,这个值表示该部分配置应该应用在哪 个Profile里。第二段中定义的属性应用于开发环境,因为spring.profiles设置为 development。与之类似,最后一段的spring.profile设置为production,在production Profile被激活时生效。

另一方面,第一段并未指定spring.profiles,因此这里的属性对全部Profile都生效,或 者对那些未设置该属性的激活Profile生效。