36a3f764ec360989d432abb95413da59. 概述

Spring Boot中的一种常见做法是使用外部配置来定义我们的属性。这使我们能够在不同的环境中使用相同的应用程序代码。我们可以使用属性文件、YAML 文件、环境变量和命令行参数。在本文中,我们将探讨properties和 YAML 文件之间的主要区别。

2. 属性配置

默认情况下,Spring Boot可以访问在 application.properties 文件中设置的配置,该文件使用键值格式:

spring.datasource.url=jdbc:h2:dev
spring.datasource.username=SA
spring.datasource.password=password

这里的每一行都是一个配置,因此我们需要通过对键使用相同的前缀来表达分层数据。在此示例中,每个键都属于 spring.datasource。

2.1. 属性中的占位符

在我们的值中,我们可以使用带有 ${} 语法的占位符来引用其他键、系统属性或环境变量的内容:

app.name=MyApp
app.description=${app.name} is a Spring Boot application

2.2. 列表结构

如果我们具有不同值的相同类型的属性,则可以使用数组索引表示列表结构:

application.servers[0].ip=127.0.0.1
application.servers[0].path=/path1
application.servers[1].ip=127.0.0.2
application.servers[1].path=/path2
application.servers[2].ip=127.0.0.3
application.servers[2].path=/path3

2.3. 多个配置文件

从 2.4.0 版本开始,Spring Boot支持创建多文档属性文件。简而言之,我们可以将单个物理文件拆分为多个逻辑文档。这允许我们为需要声明的每个配置文件定义一个文档,所有这些都在同一个文件中:

logging.file.name=myapplication.log
bael.property=defaultValue
#---
spring.config.activate.on-profile=dev
spring.datasource.password=password
spring.datasource.url=jdbc:h2:dev
spring.datasource.username=SA
bael.property=devValue
#---
spring.config.activate.on-profile=prod
spring.datasource.password=password
spring.datasource.url=jdbc:h2:prod
spring.datasource.username=prodUser
bael.property=prodValue

请注意,我们使用“#---”表示法来指示要拆分文档的位置。

在此示例中,我们有两个带有不同轮廓的spring部分。此外,我们可以在根级别拥有一组通用属性 — 在这种情况下,logging.file.name 属性在所有配置文件中都是相同的。

2.4. 跨多个文件的配置文件

作为在同一文件中具有不同配置文件的替代方法,我们可以跨不同文件存储多个配置文件。在版本 2.4.0 之前,这是可用于属性文件的唯一方法。

我们通过在文件名中输入配置文件的名称来实现这一点,例如,application-dev.yml 或 application-dev.properties。

3. YAML配置3.1. YAML格式

除了 Java 属性文件,我们还可以在 Spring Boot应用程序中使用基于 YAML 的配置文件。YAML 是指定分层配置数据的便捷格式。

现在,让我们从属性文件中获取相同的示例,并将其转换为 YAML:

spring:
    datasource:
        password: password
        url: jdbc:h2:dev
        username: SA

这可能比其属性文件替代项更具可读性,因为它不包含重复的前缀。

3.2. 列表结构

YAML 具有更简洁的列表表示格式:

application:
    servers:
    -   ip: '127.0.0.1'
        path: '/path1'
    -   ip: '127.0.0.2'
        path: '/path2'
    -   ip: '127.0.0.3'
        path: '/path3'

3.3. 多个配置文件

与properties文件不同,YAML 在设计上支持多文档文件,这样,无论我们使用哪个版本的 Spring Boot,我们都可以在同一文件中存储多个配置文件。

但是,在这种情况下,规范表明我们必须使用三个“---”来指示新文档的开始:

logging:
  file:
    name: myapplication.log
---
spring:
  config:
    activate:
      on-profile: staging
  datasource:
    password: 'password'
    url: jdbc:h2:staging
    username: SA
bael:
  property: stagingValue

注意:我们通常不希望同时在项目中同时包含标准 application.properties 和 application.yml 文件,因为这可能会导致意外结果。

例如,如果我们将上面显示的属性(在 application.yml 文件中)与第 2.3 节中描述的属性相结合,那么 bael.property 将被分配默认值而不是特定于配置文件的值。这仅仅是因为稍后会加载 application.properties,覆盖到该点之前分配的值。

4. Spring Boot用法

现在我们已经定义了我们的配置,让我们看看如何访问它们。

4.1.Value注解

我们可以使用@Value注解注入属性的值:

@Value("${key.something}")
private String injectedProperty;

在这里,属性 key.something 通过字段注入到我们的一个对象中。

4.2.Environment对象

我们还可以使用环境 API 获取属性的值:

@Autowired
private Environment env;
public String getSomeKey(){
    return env.getProperty("key.something");
}

4.3. 配置属性注释

最后,我们还可以使用 @ConfigurationProperties 注释将我们的属性绑定到类型安全的结构化对象:

@ConfigurationProperties(prefix = "mail")
public class ConfigProperties {
    String name;
    String description;
...


创业/副业必备:

本站已持续更新1W+创业副业顶尖课程,涵盖多个领域。

点击查看详情

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。