作者其他技術文章
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 入門教程