SpringBoot2.x基礎(chǔ)篇:談?wù)凷pringBoot內(nèi)提供的這幾種配置綁定

知識(shí)改變命運(yùn)仑性,擼碼使我快樂(lè)惶楼,2020繼續(xù)游走在開(kāi)源界

點(diǎn)贊再看,養(yǎng)成習(xí)慣

給我來(lái)個(gè)Star吧诊杆,點(diǎn)擊了解下基于SpringBoot的組件化接口服務(wù)落地解決方案

常見(jiàn)配置綁定方式

SpringBoot在不斷地版本迭代中陸續(xù)提供了不同的配置參數(shù)綁定的方式歼捐,我們可以單獨(dú)獲取一個(gè)配置參數(shù)也可以將一系列的配置映射綁定到JavaBean的屬性字段,下面我們來(lái)看看這幾種方式的配置綁定哪一種是你最常用到的晨汹。

推薦閱讀

示例配置參數(shù)

system:
  config:
    app-id: hengboy
    app-secret: yuqiyu@admin

上面是一段示例的配置參數(shù)豹储,提供給下面的配置綁定方式來(lái)使用。

@Configuration方式綁定

當(dāng)我們需要將一個(gè)配置前綴下的參數(shù)映射綁定到JavaBean的屬性字段時(shí)淘这,我們可以考慮使用@ConfigurationProperties + @Configuration注解組合的方式颂翼,使用如下所示:

/**
 * 系統(tǒng)配置
 *
 * @author 恒宇少年
 */
@Configuration
@ConfigurationProperties(prefix = SYSTEM_CONFIG_PREFIX)
@Data
public class SystemConfig {
    /**
     * 系統(tǒng)配置前綴
     */
    public static final String SYSTEM_CONFIG_PREFIX = "system.config";

    private String appId;
    private String appSecret;
}

注意事項(xiàng):配置參數(shù)與JavaBean屬性之間的綁定是通過(guò)調(diào)用JavaBean屬性的Setter方法來(lái)賦值的晃洒,所以我們需要提供對(duì)應(yīng)屬性字段的Setter方法。

由于@Configuration注解被@Component修飾朦乏,所以我們?cè)谑褂脮r(shí)只需要注入SystemConfig配置綁定映射類(lèi)即可球及,通過(guò)Getter方法來(lái)獲取對(duì)應(yīng)配置參數(shù)的值。

配置掃描路徑方式綁定

如果你系統(tǒng)中需要?jiǎng)?chuàng)建的配置映射類(lèi)較多呻疹,而且每一個(gè)類(lèi)都需要交付給IOC容器進(jìn)行托管吃引,那么可以考慮使用@ConfigurationPropertiesScan + @ConfigurationProperties注解組合的方式,使用如下所示:

@SpringBootApplication
@ConfigurationPropertiesScan
public class ConfigureBindingAwayApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConfigureBindingAwayApplication.class, args);
    }
}

我們首先需要在XxxApplication應(yīng)用程序啟動(dòng)類(lèi)上添加@ConfigurationPropertiesScan注解刽锤,表示我們需要使用自動(dòng)掃描的方式來(lái)注冊(cè)配置映射類(lèi)镊尺,注解配置參數(shù)如下所示:

  • value:配置掃描的基礎(chǔ)package,與basePackages作用一致并思,通過(guò)數(shù)組的形式來(lái)接收配置庐氮。
  • basePackages:配置掃描的基礎(chǔ)package
  • basePackageClasses:配置基礎(chǔ)掃描類(lèi)宋彼,會(huì)將每一個(gè)掃描類(lèi)所處于的package作為掃描基礎(chǔ)package弄砍。

當(dāng)我們?cè)谑褂?code>@ConfigurationPropertiesScan注解時(shí),如果不進(jìn)行自定義掃描路徑输涕,默認(rèn)使用SpringBoot應(yīng)用程序掃描的packages音婶。

使用這種方式我們配置映射類(lèi)就不再需要添加@Configuration注解了,這是因?yàn)槲覀冊(cè)谑褂?code>@ConfigurationPropertiesScan注解時(shí)莱坎,會(huì)通過(guò)@Import方式來(lái)引用配置映射類(lèi)的注冊(cè)實(shí)現(xiàn)衣式,詳見(jiàn):org.springframework.boot.context.properties.ConfigurationPropertiesScanRegistrar#registerBeanDefinitions,配置映射類(lèi)如下所示:

/**
 * 系統(tǒng)配置
 *
 * @author 恒宇少年
 */
@ConfigurationProperties(prefix = SYSTEM_CONFIG_PREFIX)
@Data
public class SystemConfig {
    /**
     * 系統(tǒng)配置前綴
     */
    public static final String SYSTEM_CONFIG_PREFIX = "system.config";

    private String appId;
    private String appSecret;
}

構(gòu)造函數(shù)方式綁定

在上面的兩種方式都是通過(guò)Setter方法來(lái)進(jìn)行映射字段的賦值檐什,而構(gòu)造函數(shù)綁定方式是通過(guò)構(gòu)造函數(shù)來(lái)進(jìn)行賦值的碴卧,我們只需要在配置映射類(lèi)上添加@ConstructorBinding注解并提供對(duì)應(yīng)的構(gòu)造函數(shù)即可,使用方式如下所示:

/**
 * 系統(tǒng)配置
 *
 * @author 恒宇少年
 */
@ConfigurationProperties(prefix = SYSTEM_CONFIG_PREFIX)
@ConstructorBinding
@Getter
public class SystemConfig {
    /**
     * 系統(tǒng)配置前綴
     */
    public static final String SYSTEM_CONFIG_PREFIX = "system.config";

    public SystemConfig(String appId, String appSecret) {
        this.appId = appId;
        this.appSecret = appSecret;
    }

    private String appId;
    private String appSecret;
}

在之前我也寫(xiě)過(guò)一篇關(guān)于構(gòu)造函數(shù)映射配置參數(shù)的問(wèn)題乃正,詳情訪(fǎng)問(wèn):@ConstructorBinding注解的使用

第三方類(lèi)綁定

如果我們需要將配置參數(shù)映射綁定到第三方依賴(lài)內(nèi)提供的JavaBean螟深,我們?cè)撌褂檬裁捶绞侥兀坑捎诮邮諈?shù)的類(lèi)并不是我們自己編寫(xiě)的烫葬,所以沒(méi)有辦法對(duì).class文件源碼進(jìn)行修改界弧。

這時(shí)我們可以將第三方提供的JavaBean交給IOC容器托管,然后結(jié)合@ConfigurationProperties注解來(lái)映射綁定配置參數(shù)搭综,使用方式如下所示:

@Bean
@ConfigurationProperties(prefix = SYSTEM_CONFIG_PREFIX)
public SystemConfig systemConfig() {
    return new SystemConfig();
}

這種方式也需要第三方提供的JavaBean有映射字段的Setter方法垢箕,否則無(wú)法進(jìn)行賦值。

我們知道通過(guò)@Bean注解修飾的方法兑巾,會(huì)將方法的返回值加入到IOC容器內(nèi)条获,那我們?cè)谑褂门渲脮r(shí),直接注入配置映射類(lèi)就可以了蒋歌。

總結(jié)

上面這幾種配置綁定方式都遵循OOP實(shí)現(xiàn)帅掘,當(dāng)然如果你只需要獲取一個(gè)配置參數(shù)委煤,使用@Value也是一個(gè)好的選擇,沒(méi)有更好修档,只有更合適碧绞,根據(jù)每一種綁定方式的特點(diǎn)合理的選擇一個(gè)合適業(yè)務(wù)的方式。

作者個(gè)人 博客
使用開(kāi)源框架 ApiBoot 助你成為Api接口服務(wù)架構(gòu)師

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末吱窝,一起剝皮案震驚了整個(gè)濱河市讥邻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌院峡,老刑警劉巖兴使,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異照激,居然都是意外死亡发魄,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)俩垃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)励幼,“玉大人,你說(shuō)我怎么就攤上這事吆寨∩吞剩” “怎么了踩寇?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵啄清,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我俺孙,道長(zhǎng)辣卒,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任睛榄,我火速辦了婚禮荣茫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘场靴。我一直安慰自己啡莉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布旨剥。 她就那樣靜靜地躺著咧欣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪轨帜。 梳的紋絲不亂的頭發(fā)上魄咕,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音蚌父,去河邊找鬼哮兰。 笑死毛萌,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的喝滞。 我是一名探鬼主播阁将,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼囤躁!你這毒婦竟也來(lái)了冀痕?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤狸演,失蹤者是張志新(化名)和其女友劉穎言蛇,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體宵距,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡腊尚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了满哪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片婿斥。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖哨鸭,靈堂內(nèi)的尸體忽然破棺而出民宿,到底是詐尸還是另有隱情,我是刑警寧澤像鸡,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布活鹰,位于F島的核電站,受9級(jí)特大地震影響只估,放射性物質(zhì)發(fā)生泄漏志群。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一蛔钙、第九天 我趴在偏房一處隱蔽的房頂上張望锌云。 院中可真熱鬧,春花似錦吁脱、人聲如沸桑涎。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)攻冷。三九已至,卻和暖如春紧显,著一層夾襖步出監(jiān)牢的瞬間讲衫,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留涉兽,地道東北人招驴。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像枷畏,于是被迫代替她去往敵國(guó)和親别厘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353