參考地址:https://www.cnblogs.com/FraserYu/p/11261916.html
在編寫項目代碼時,我們要求更靈活的配置,更好的模塊化整合。在 Spring Boot 項目中,為滿足以上要求,我們將大量的參數配置在 application.properties 或 application.yml 文件中,通過 @ConfigurationProperties
注解,我們可以方便的獲取這些參數值
使用 @ConfigurationProperties 配置模塊
假設我們正在搭建一個發送郵件的模塊。在本地測試,我們不想該模塊真的發送郵件,所以我們需要一個參數來「開關」 disable 這個功能。另外,我們希望為這些郵件配置一個默認的主題,這樣,當我們查看郵件收件箱,通過郵件主題可以快速判斷出這是測試郵件
在 application.properties 文件中創建這些參數:
我們可以使用 @Value
注解或着使用 Spring Environment
bean 訪問這些屬性,是這種注入配置方式有時顯得很笨重。我們將使用更安全的方式(@ConfigurationProperties
)來獲取這些屬性
@ConfigurationProperties
的基本用法非常簡單:我們為每個要捕獲的外部屬性提供一個帶有字段的類。請注意以下幾點:
- 前綴定義了哪些外部屬性將綁定到類的字段上
- 根據 Spring Boot 寬松的綁定規則,類的屬性名稱必須與外部屬性的名稱匹配
- 我們可以簡單地用一個值初始化一個字段來定義一個默認值
- 類本身可以是包私有的
- 類的字段必須有公共 setter 方法
Spring 寬松綁定規則 (relaxed binding)
Spring使用一些寬松的綁定屬性規則。因此,以下變體都將綁定到 hostName 屬性上:
如果我們將 MailModuleProperties 類型的 bean 注入到另一個 bean 中,這個 bean 現在可以以類型安全的方式訪問那些外部配置參數的值。
但是,我們仍然需要讓 Spring 知道我們的 @ConfigurationProperties 類存在,以便將其加載到應用程序上下文中( 面試還不知道 BeanFactory 和 ApplicationContext 的區別?)
激活 @ConfigurationProperties
對於 Spring Boot,創建一個 MailModuleProperties 類型的 bean,我們可以通過下面幾種方式將其添加到應用上下文中
首先,我們可以通過添加 @Component 注解讓 Component Scan 掃描到,再配合AutoWaird
我們還可以使用 @EnableConfigurationProperties
注解讓我們的類被 Spring Boot 所知道,在該注解中其實是用了@Import(EnableConfigurationPropertiesImportSelector.class)
實現,大家可以看一下
激活一個 @ConfigurationProperties 類的最佳方式是什么?
所有上述方法都同樣有效。然而,我建議模塊化你的應用程序,並讓每個模塊提供自己的
@ConfigurationProperties
類,只提供它需要的屬性,就像我們在上面的代碼中對郵件模塊所做的那樣。這使得在不影響其他模塊的情況下重構一個模塊中的屬性變得容易。