版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
第Value注解支持對象類型ConfigurationProperties功能目錄真實業(yè)務(wù)場景解決方案一解決方案二
真實業(yè)務(wù)場景
(不希望配置類注冊為Bean或不希望聲明@ConfigurationProperties)
假設(shè)某一個jar包內(nèi)封裝了DataSourceProperties
@Configuration
@ConfigurationProperties(
prefix="my.datasource"
@Data
publicclassDataSourceProperties{
privateListStringsuffix;
privateListDataSourceDetailProperties
在jar包的Configuration中,某個@Bean的構(gòu)造過程中引用了這個DataSourceProperties
publicJdbcTemplatebuildJdbcTemplate(DataSourcePropertiesdataSourceProperties){
在某個業(yè)務(wù)場景中,同時存在兩個DataSourceProperties會造成一個問題,注入的時候會提示有多個候選的bean但是沒法去修改Jar包中的內(nèi)容
自己重復(fù)寫一個DataSourceProperties不是很優(yōu)雅
這時候引出了一個需求,DataSourceProperties不希望注冊為Bean,但是能夠從配置文件讀取構(gòu)建對象
解決方案一
使用perties.bind.Binder從配置文件構(gòu)建配置對象
@Bean
publicJdbcTemplatebuildJdbcTemplate(Environmentenvironment){
Binderbinder=Binder.get(environment);
DataSourceProperties
properties1=binder.bind("my.datasource1",Bindable.of(DataSourceProperties.class)).get(),
properties2=binder.bind("my.datasource2",Bindable.of(DataSourceProperties.class)).get();
binder.bind(xxx,Bindable.of(type)).get()似乎是重復(fù)的編碼方式?
解決方案二
使@Value注解能夠支持自動調(diào)用這段代碼binder.bind(xxx,Bindable.of(type)).get()例如
@Bean
publicJdbcTemplatebuildJdbcTemplate(@Value("my.datasource1")DataSourcePropertiesproperties1,
@Value("my.datasource2")DataSourcePropertiesproperties2){
org.springframework.beans.factory.support.DefaultListableBeanFactory#doResolveDependency最后會交由converter處理
Classtype=descriptor.getDependencyType();
Objectvalue=getAutowireCandidateResolver().getSuggestedValue(descriptor);
if(value!=null){
if(valueinstanceofString){
StringstrVal=resolveEmbeddedValue((String)value);
BeanDefinitionbd=(beanName!=nullcontainsBean(beanName)
getMergedBeanDefinition(beanName):null);
value=evaluateBeanDefinitionString(strVal,bd);
TypeConverterconverter=(typeConverter!=nulltypeConverter:getTypeConverter());
try{
returnconverter.convertIfNecessary(value,type,descriptor.getTypeDescriptor());
catch(UnsupportedOperationExceptionex){
//AcustomTypeConverterwhichdoesnotsupportTypeDescriptorresolution...
return(descriptor.getField()!=null
converter.convertIfNecessary(value,type,descriptor.getField()):
converter.convertIfNecessary(value,type,descriptor.getMethodParameter()));
項目啟動時,添加StringtoObject的轉(zhuǎn)換器,支持@Value并且bind:開頭(防止影響@Value原有功能)
packagecom.nuonuo.accounting.guiding.support.spring;
importorg.springframework.beans.factory.annotation.Value;
importperties.bind.Bindable;
importperties.bind.Binder;
importorg.springframework.boot.convert.ApplicationConversionService;
importorg.springframework.context.ApplicationContextInitializer;
importorg.springframework.context.ConfigurableApplicationContext;
importorg.springframework.core.convert.TypeDescriptor;
importorg.springframework.core.convert.converter.ConditionalGenericConverter;
importjava.util.Set;
importstaticjava.util.Collections.singleton;
*@authoruhfun
publicclassValuePropertiesBindableAnnotationSupportimplementsApplicationContextInitializerConfigurableApplicationContext{
privatestaticfinalStringPREFIX="bind:";
@Override
publicvoidinitialize(ConfigurableApplicationContextcontext){
Binderbinder=Binder.get(context.getEnvironment());
((ApplicationConversionService)context.getBeanFactory().getConversionService()).addConverter(newConditionalGenericConverter(){
@Override
publicbooleanmatches(TypeDescriptorsourceType,TypeDescriptortargetType){
Valuevalue=targetType.getAnnotation(Value.class);
returnvalue!=nullvalue.value().startsWith(PREFIX);
@Override
publicSetConvertiblePairgetConvertibleTypes(){
returnsingleton(newConvertiblePair(String.class,Object.class));
@Override
publicObjectconvert(Objectsource,TypeDescriptorsourceType,TypeDescriptortargetType){
Valuevalue=targetType.getAnnotation(Value.class);
Classtype=targetType.getType();
assertvalue!=null;
returnbinder.bind(value.value().replace(PREFIX,""),Bindable.of(type)).get();
轉(zhuǎn)換后代碼執(zhí)行binder.bind(value.value().replace(PREFIX,),Bindable.of(type)).get();目的就達(dá)成了
在META-INF/spring.factories中添加注冊的Bean
#ApplicationContextInitializer
org.springframework.context.ApplicationContextInitializer=\
com.nuonuo.accounting.guiding.support.spring.ValuePropertiesBindableAnnotationSupport,\
最終效果
@Bean
publicJdbcTempl
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 安全標(biāo)準(zhǔn)化生產(chǎn)責(zé)任制度
- 生產(chǎn)安全考核與獎勵制度
- 生產(chǎn)車輛全過程管理制度
- 生產(chǎn)場所巡檢制度范本
- 企業(yè)生產(chǎn)檔案管理制度
- 生產(chǎn)副班長生產(chǎn)管理制度
- 2026重慶市涪陵區(qū)武陵山鎮(zhèn)人民政府招聘公益性崗位1人參考考試題庫附答案解析
- 生產(chǎn)車間防蠅蟲制度
- 生產(chǎn)函數(shù)與科學(xué)制度
- 先進生產(chǎn)班組管理制度
- 2024年水合肼行業(yè)發(fā)展現(xiàn)狀分析:水合肼市場需求量約為11.47萬噸
- 肺炎性假瘤誤診為肺癌的HRCT表現(xiàn)及淺析
- (正式版)JBT 14933-2024 機械式停車設(shè)備 檢驗與試驗規(guī)范
- 幼兒園勞動教育計劃及實施
- 新人教版五年級小學(xué)數(shù)學(xué)全冊奧數(shù)(含答案)
- 志愿服務(wù)證明(多模板)
- 術(shù)后腸麻痹學(xué)習(xí)課件
- 淋膜作業(yè)標(biāo)準(zhǔn)指導(dǎo)書
- 頂管施工方案非開挖電纜管道專項施工方案
- XX小學(xué)傳統(tǒng)體育游戲集錦
- GB/T 33091-2016聚氨酯篩板
評論
0/150
提交評論