知識(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ù)的方式。