天天看点

application.yml 与 application.properties详解

作者其他技术文章

1) 初识 Spring Boot-Spring Boot教程深入浅出系列

2)spring cloud 入门教程

3)SpringCloud入门之Spring Boot多环境配置切换指南

4) Elasticsearch从入门到精通

5) Kibana从入门到精通

6) logstash快速入门实战指南

7)Oracle性能优化之查询语句通用原则  

8)Redis常用命令

9) 详解Maven用户的配置settings.xml

10SpringCloud入门之YAML格式文件规范学习

11)#ifndef、#def、#endif说明

12)SpringCloud入门之常用的配置文件 application.yml和 bootstrap.yml区别

1. 概述

Spring Boot 中的一个常见做法是使用外部配置来定义我们的属性。这允许我们在不同的环境中使用相同的应用程序代码。

我们可以使用属性文件、YAML 文件、环境变量和命令行参数。

在这个简短的教程中,我们将探讨属性和 YAML 文件之间的主要区别。

2. 属性配置

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

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

在这里每一行都是一个配置。因此在application.properties文件中我们必须通过对键使用相同的前缀来表示分层数据。而且在这个application.properties例子中,每个键都属于spring.datasource。

2.1. 在 application.properties文件属性中使用占位符

在我们application.properties或application.yml文件定义的值中,我们可以使用带有${}语法的占位符来引用application.properties或application.yml中出现过的其他键、系统属性或环境变量的内容,以下示例演示如何在application.properties使用这项技能:

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

2.2. application.properties的列表结构

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

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 支持创建多文档属性application.properties或application.yml文件。简单地说,我们可以将单个物理文件拆分为多个逻辑文档。

这允许我们为需要声明的每个配置文件定义一个文档,所有这些都在同一个application.properties或application.yml文件中,以下示例演示如何在application.properties定义这些属性:

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           

请注意,我们使用“#---”或“---”符号来指示我们要拆分文档的位置,可以参阅本博主的文章SpringCloud入门之Spring Boot多环境配置切换指南。

在这个application.properties例子中,我们有两个带有不同逻辑的声明部分。此外,我们可以在根级别拥有一组通用属性——在这种情况下,logging.file.name属性在所有application.properties或application.yml配置文件中都相同。

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

作为在同一文件中拥有不同配置文件的替代方案,我们可以在不同文件中存储多个application.properties或application.yml配置文件。在 2.4.0 版之前,这是唯一可用于属性文件的方法。

我们通过将配置文件的名称放在文件名中来实现这一点 - 例如,application-dev.yml或 application-dev.properties。可以参阅本博主的文章SpringCloud入门之Spring Boot多环境配置切换指南。

3. YAML 配置

3.1. YAML 格式

除了 Java 属性文件,我们还可以在 Spring Boot 应用程序中使用基于YAML的配置文件。YAML 是一种用于指定分层配置数据的便捷格式,关于YAML的学习可以参阅手把手学系列之YAML格式文件规范学习。

现在,让我们从application.properties属性文件中获取相同的示例并将其转换为 YAML格式application.yml配置文件:

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

这比它的属性文件application.properties更具可读性,因为它不包含重复的前缀。

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. 多个配置文件

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

然而,application.yml在这种情况下,规范表明我们必须使用三个破折号来指示新文档的开始:

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将被分配 defaultValue 而不是特定于配置文件的值。这仅仅是因为application.properties 是稍后加载的覆盖了当时分配的值。

4. Spring Boot 使用

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

4.1. 值注释

我们可以使用@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;
...           

5. 结论

在本文中,我们看到了Spring Boot 配置文件和yml属性之间的一些差异 。我们还看到了它们的值如何引用其他属性。最后,我们研究了如何将值注入我们的运行时。

关于Java平台下微服务实践可以参考笔者以下文章

使用 Zuul、Ribbon、Feign、Eureka 和 Sleuth、Zipkin 创建简单spring cloud微服务用例-spring cloud 入门教程

微服务集成SPRING CLOUD SLEUTH、ELK 和 ZIPKIN 进行监控-spring cloud 入门教程

使用Hystrix 、Feign 和 Ribbon构建微服务-spring cloud 入门教程

使用 Spring Boot Admin 监控微服务-spring cloud 入门教程

基于Redis做Spring Cloud Gateway 中的速率限制实践-spring cloud 入门教程

集成SWAGGER2服务-spring cloud 入门教程

Hystrix 简介-spring cloud 入门教程

Hystrix 原理深入分析-spring cloud 入门教程 

使用Apache Camel构建微服务-spring cloud 入门教程

集成 Kubernetes 来构建微服务-spring cloud 入门教程

集成SPRINGDOC OPENAPI 的微服务实践-spring cloud 入门教程

SPRING CLOUD 微服务快速指南-spring cloud 入门教程

基于GraphQL的微服务实践-spring cloud 入门教程

最火的Spring Cloud Gateway 为经过身份验证的用户启用速率限制实践-spring cloud 入门教程

继续阅读