(八)Spring Boot配置篇 之 使用 Profile 进行配置
@Profile("production") @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { ... }
这里用的@Profile注解要求运行时激活production Profile,这样才能应用该配置。如果production Profile没有激活,就会忽略该配置,而此时缺少其他用于覆盖的安全配置,于是应用自动配置的安全配置。设置spring.profiles.active属性就能激活Profile,任意设置配置属性的方式都能用于设置这个值。例如,在命令行里运行应用程序时,可以这样激活production Profile:
$ java -jar readinglist-0.0.1-SNAPSHOT.jar --spring.profiles.active=production
也可以向application.yml里添加spring.profiles.active属性:
spring:
profiles:
active: production
还可以设置环境变量,将其放入application.properties,或者使用3.2节开头提到的各种方法。但由于Spring Boot的自动配置替你做了太多的事情,要找到一个能放置@Profile的地方还真不怎么方便。幸运的是,Spring Boot支持为application.properties和application.yml里的属性配置Profile。为了演示区分Profile的属性,假设你希望针对生产环境和开发环境能有不同的日志配置。在生产环境中,你只关心WARN或更高级别的日志项,想把日志写到日志文件里。在开发环境中,你只想把日志输出到控制台,记录DEBUG或更高级别。而你所要做的就是为每个环境分别创建配置。那要怎么做呢?这取决于你用的是属性文件配置还是YAML配置。
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
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,在productionProfile被激活时生效。另一方面,第一段并未指定spring.profiles,因此这里的属性对全部Profile都生效,或者对那些未设置该属性的激活Profile生效。