Value注解支持對象類型ConfigurationProperties功能_第1頁
Value注解支持對象類型ConfigurationProperties功能_第2頁
Value注解支持對象類型ConfigurationProperties功能_第3頁
Value注解支持對象類型ConfigurationProperties功能_第4頁
Value注解支持對象類型ConfigurationProperties功能_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論