背景
網(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ù)上面了解到的知識,貌似我們只能定義多個
username
、password
屬性來區(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
中的 username
的 key
為 order-servcie 和 user-service, value
分別對應(yīng)aaaa
和 bbbb
, password
類似
- 相信看到大家都已經(jīng)理解是如何配置的了,具體的裝配細(xì)節(jié)在
spring-beans
包中,本文不展開說了。
代碼體驗
- 本文內(nèi)容提供了demo供大家了解體驗
-
github
地址: https://github.com/vincent-ren/SCLeanning
操作流程
- 拉取git倉庫
- 找到
configuration-demo
工程,切換至其pom.xml
文件下 - 編譯打包:
mvn clean package
- 啟動項目:
java -jar target/configuration-demo-0.0.1-SNAPSHOT.war
- 項目啟動在8080端口,瀏覽器輸入:
http://localhost:8080/test/{serviceName}
serviceName
為配置中獲取 username
和 password
的 key
, 根據(jù)配置文件的定義,輸入user-service
會顯示userName is: bbbb, password is: bbbb
,大家可以自己修改配置文件,來進(jìn)行體驗。
總結(jié)
本文主要說明的是介紹如何定義屬性為Map類型的配置類,個人感覺這個還是一個比較有實用性的知識點,所以分享出來,歡迎有更多見解的朋友來進(jìn)行交流。