精進 Spring Boot 03:Spring Boot 的配置檔案和配置管理,以及用三種方式讀取配置檔案

Felix Liang發表於2021-08-08

精進 Spring Boot 03:Spring Boot 的配置檔案和配置管理,以及用三種方式讀取配置檔案

內容簡介:本文介紹 Spring Boot 的配置檔案和配置管理,以及介紹了三種讀取配置檔案的方式,並進行程式碼演示。

在 Spring Boot 出現之前,一個 Spring 專案普遍會存在很多個配置檔案,例如有配置與 web 伺服器相關資訊的 web.xml,有配置 Spring 本身的各種 application-xxx.xml,一份 xxx 對應 Sping 的一個功能模組,例如 MVC 和 Data Source,還有第三方外掛 如 log4j 等配置檔案。此外,應用程式本身也可能存在多個配置檔案,剛去數這些配置檔案的數目都讓人感覺暈腦袋,更別說去管理和配置它們了。

Spring Boot 技術的到來,大大地簡化了這些配置檔案的管理和讀取。對於 Spring.配置資訊,它所支援的第三方框架的配置資訊,應用自定義的配置資訊,通通都整合了在一個application.properties 檔案中,過去可能存在近10個的配置檔案,如今只需要一個即可。不用再像以前那樣,配置資訊散落在應用的不同配置檔案。這顯然大大的簡化了配置資訊的管理工作,當然也相應地減少了出錯的概率。

1、Web 伺服器的配置

Spring Boot 啟動的預設 web 伺服器是 Tomcat,而埠為 8080,上下文是“/”。對於這些預設設定,我們都可以在 appication.properties 中重新配置。

我們現在在 appication.properties 中新增兩行程式碼

server.port=9090
server.servlet.context-path=/home`

image

按快捷鍵 Shift + F10 執行程式,輸入原先的 網址 http://localhost:8080/hello
發現找不到伺服器。原因是我們已經利用上面兩行程式碼修改的 Tomcat 的埠號和應用的上下文。我們輸入以下網址就可以看到結果了。

http://localhost:9090/home/hello

image

2、用 Undertow 替換預設的 Tomcat 伺服器

Spring Boot 預設內建的 web 伺服器是 Tomcat。事實上,它支援三種巢狀的 web 伺服器,另外兩種是 Jetty 和 Undertow,而 Undertow 效能最優,可以將它設定為 web 伺服器,取代另外兩種。

Spring Boot 的 spring-boot-starter-web 預設巢狀了 Tomcat。當我們更換為其它 web 伺服器時,如更換為 Undertow,需要把 Tomcat 給遮蔽掉。同時,還需要引進相應 web 伺服器對應的 starter。

現在我們嘗試把 web 伺服器切換為 Undertow,像下面那樣修改 pom.xml

image

網上所查到的切換 web 伺服器方案大多如上,但是在 IDEA 中編譯執行程式,它總是
頑固地使用 Tomcat,而不啟用 Undertow。這時候有足夠理由懷疑這是 IDEA 的快取問題所造成的,需要像下面這樣重新整理一下 IDEA 的 Maven 專案。

image

重新整理 Maven 專案後,然後再使用 Maven 來編譯一下程式,像下圖那樣雙擊 install。

image

編譯完之後,按快捷鍵 Shift + F10 執行程式,此時可以看見日誌輸出顯示 Undertow 已經成功啟動了。

image

3、讀取 Spring Boot 的配置

可以在應用中讀取 application.properties 的配置檔案,並獲取其中配置資訊,以供應用程式使用。事實上 Spring Boot 提供了三種方式來讀取配置檔案。
第 1 種方法是通過 Environment 類 的 getPropery() 方法讀取。
第 2 種方法是通過 @Value 註解來自動注入屬性值。
第 3 種方法是將一組屬性自動注入到一個配置類中。

我們先在 application.properties 中加入如下四行配置,然後分別用三種方法來讀取。

app.message1=Hi, Felix!
app.message2=You are really an IT expert.
app.num1=4
app.num2=5

現在修改 HelloWorld 的 sayHello 方法,使用 @Value 註解的方法讀取 app.message1,用 Enviornment.getProperty() 讀取 app.message2,用 @Autowired 把Environment 注入進來,就可以呼叫它的 getProperty() 方法了。程式碼如下:

image

啟動程式後,成功用兩種方式讀出配置檔案的資料,在瀏覽器的輸出結果如下:

image

第 3 種讀取配置檔案的方法是將一組屬性自動注入到一個配置類中,這時需要藉助註解 @ConfigurationProperties 和 @Configuration,我們用這種方式讀取 app.num1 和 app.num2 的值,並對它們求和,然後輸出結果。還是上程式碼。

image

AppConfig 類使用了兩個註解 @ConfigurationProperties 和 @Configuration,在 @ConfigurationProperties 中輸入了引數 “app”,它是屬性 app.num1 和 app.num2 的字首,從以下程式碼可以看出 AppConfig 就是一個普通的 POJO 檔案,只不過是加上了註解。

接下來再看如何使用 AppConfig 這個類。現在我們新建一個求和的控制器 SumController,使用註解 @Autowired 把 AppConfig 自動注入進來,就可以使用了,是不是很方便、很簡單。

image

按 Shift + F10 啟動程式,輸入 Sum 方法對應的 url http://localhost:9090/home/sum,即可看到結果。

image

好了,飛仙時空寫的第三篇 Spring Boot 到此結束,歡迎轉發和關注。

Enjoy coding.

相關文章