Spring Boot中如何添加配置項而不需要增加對應(yīng)的類對象屬性定義

背景

網(wǎng)上眾多文章都描述了 @ConfigurationProperties(prefix = "xxx")@Value("${xxxx}") 的如何使用,但是這些文章大部分都是講述的一個配置項對應(yīng)一個類對象屬性。 當(dāng)我看到Zuul的配置文件及其路由規(guī)則的時候,產(chǎn)生了一個疑問,為什么可以只增加路由規(guī)則就可以實現(xiàn)路由了,難道不應(yīng)該對應(yīng)增加類的屬性來接收嗎? 這個問題我沒有在網(wǎng)上搜到答案,于是仔細(xì)的查看Zuul的配置類,終于找到答案,本文主要針對這個問題來講述。

小小鋪墊

  • @Configuration 該注解會將標(biāo)注的類交由 Spring 容器管理,一般標(biāo)注在配置類上
  • @ConfigurationProperties 該注解用來描述被標(biāo)注的類的配置項,常常用來指定前綴和指定配置文件路徑,簡化配置類的屬性名定義
@Configuration
@ConfigurationProperties(prefix = "mail")
public class MailProperties { 
  public static class Smtp {  
    private boolean auth;  
    private boolean starttlsEnable;  
    // ... getters and setters 
  }
  private String host;
  private int port;  
  private String from; 
  private String username;
  private String password; 
  private Smtp smtp; 
  // ... getters and setters
}

application.properties 文件內(nèi)容為

mail.host=localhost
mail.port=25
mail.smtp.auth=false
mail.smtp.starttls-enable=false
mail.from=hello@localhost
mail.username=aaaa
mail.password=aaaa

通過其上兩段代碼,就可以知道其配置規(guī)則是根據(jù)屬性名來進(jìn)行匹配。

問題來了

  • 上面代碼我們知道是定義發(fā)送Email的配置,假設(shè)該功能在微服務(wù)中,那么有一個需求就是該微服務(wù)應(yīng)該提供賬號和密碼來分別發(fā)送不同業(yè)務(wù)服務(wù)的郵件。根據(jù)上面了解到的知識,貌似我們只能定義多個 usernamepassword 屬性來區(qū)分,這樣的話如果新增一個業(yè)務(wù)服務(wù)那么就會造成相當(dāng)大的影響。
  • 下面就要講到我們在文中開頭提的問題了,如何添加配置項而不需要增加對應(yīng)的類對象屬性的定義

代碼說明

MailProperties 改成:

@Configuration
@ConfigurationProperties(prefix = "mail")
public class MailProperties { 
  public static class Smtp {  
    private boolean auth;  
    private boolean starttlsEnable;  
    // ... getters and setters 
  }
  private String host;
  private int port;  
  private String from; 
// 改動在此處
  private Map<String, String> username;
  private Map<String, String> password; 
  private Smtp smtp; 
  // ... getters and setters
}

application.properties文件內(nèi)容改為

mail.host=localhost
mail.port=25
mail.smtp.auth=false
mail.smtp.starttls-enable=false
mail.from=hello@localhost
mail.username.order-service=aaaa
mail.password.order-service=aaaa
//如果新增一個用戶服務(wù)來發(fā)送郵件,那么新增下面配置
mail.username.user-service=bbbb
mail.password.user-service=bbbb

配置完成后,MailProperties 中的 usernamekey 為 order-servcie 和 user-service, value分別對應(yīng)aaaabbbbpassword類似

  • 相信看到大家都已經(jīng)理解是如何配置的了,具體的裝配細(xì)節(jié)在spring-beans包中,本文不展開說了。

代碼體驗

操作流程

  1. 拉取git倉庫
  2. 找到 configuration-demo 工程,切換至其 pom.xml 文件下
  3. 編譯打包: mvn clean package
  4. 啟動項目: java -jar target/configuration-demo-0.0.1-SNAPSHOT.war
  5. 項目啟動在8080端口,瀏覽器輸入: http://localhost:8080/test/{serviceName}

serviceName 為配置中獲取 usernamepasswordkey, 根據(jù)配置文件的定義,輸入user-service會顯示userName is: bbbb, password is: bbbb,大家可以自己修改配置文件,來進(jìn)行體驗。

總結(jié)

本文主要說明的是介紹如何定義屬性為Map類型的配置類,個人感覺這個還是一個比較有實用性的知識點,所以分享出來,歡迎有更多見解的朋友來進(jìn)行交流。

參考文章:http://www.lxweimin.com/p/df57fefe0ab7

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容