作者其他技術文章
1) 初識 Spring Boot-Spring Boot教程深入淺出系列
3)SpringCloud入門之Spring Boot多環境配置切換指南
5) Kibana從入門到精通
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 入門教程