3.2.3 使用 Profile 进行配置
当应用程序需要部署到不同的运行环境时,一些配置细节通常会有所不同。比如,数据库连接的细节在开发环境下和测试环境下就会不一样,在生产环境下又不一样。Spring Framework 从 Spring 3.1 开始支持基于 Profile 的配置。Profile 是一种条件化配置,基于运行时激活的 Profile,会使用或者忽略不同的 Bean 或配置类。
举例来说,假设我们在代码清单 3-1 里创建的安全配置是针对生产环境的,而自动配置的安全配置用在开发环境刚刚好。在这个例子中,我们就能为 SecurityConfig
加上 @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 配置。
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 生效。
除了自动配置和外置配置属性,Spring Boot 还有其他简化常用开发任务的绝招:它自动配置了一个错误页面,在应用程序遇到错误时显示。3.3 节,我们会介绍 Spring Boot 的错误页,以及如何定制这个错误页来适应我们的应用程序。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论