天天看點

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 入門教程

繼續閱讀