Spring @Value如何通過(guò)${}、#{}注入不同類(lèi)型的值
Spring @Value通過(guò)${}、#{}注入不同類(lèi)型值
@Value有兩種注入方式
@Value("${}")
:自定義參數(shù)獲取,獲取對(duì)應(yīng)屬性文件(yml或properties文件)中自定義的屬性@Value("#{}")
:SpEL表達(dá)式,獲取Bean的某個(gè)屬性或調(diào)用其某個(gè)方法,還可以表示常量
"${}"
可以設(shè)置默認(rèn)值,當(dāng)從配置文件中獲取不到時(shí),若沒(méi)有設(shè)置默認(rèn)值,則會(huì)拋異常。
//在指定的配置路徑后面加冒號(hào),在冒號(hào)后面給定默認(rèn)值 @Value("${constants.test:hello}")
注意:
${}和#{}可以嵌套使用,但必須#{}外面,${}在里面,先會(huì)執(zhí)行${},因?yàn)閟pring執(zhí)行${}的時(shí)機(jī)要早于#{}。
不同類(lèi)型注入
yml配置文件:
constants: test: string: test integer: 3 list: a,b,c other: a.b.c map: "{key1:'var1', key2:'var2'}"
ps:以下所有類(lèi)型注入都參考如上配置文件?。?!
String
@Value("${constants.test.string:test}") private String value; @Value("#{'test'}") private String value;
Integer
@Value("${constants.test.integer:3}") private Integer value; @Value("#{3}") private Integer value;
List
@Value("${constants.test.list:var1,var2,var3}") private List<String> sList;
上面這種方式只能使用,
逗號(hào)隔開(kāi),其他字符不會(huì)分割,不然會(huì)看成是一個(gè)整體的字符串
@Value("#{'${constants.test.other}'.split('.')}") private List<String> sList;
#{}
和${}
嵌套使用,其中${constants.test.other}
是一個(gè)String類(lèi)型的Bean,split
方法是用來(lái)分割字符串,.
為指定的分割符,當(dāng)然也可以換成其他字符,但一定要和${constants.test.other}
配置的一致
Map
@Value("#{${constants.test.map}}") private Map<String, Object> map;
注意上面的map解析中,一定要用"
雙引號(hào)把map所對(duì)應(yīng)的constants.test.map
的值包起來(lái),要不然解析會(huì)失敗,導(dǎo)致不能轉(zhuǎn)成 Map。
異常信息:
Could not resolve placeholder 'constants.test.map' in value "#{${constants.test.map}}"
指定類(lèi)型的Bean
@Configuration public class Config { @Bean("myRestTemplate") public RestTemplate restTemplate() { return new RestTemplateBuilder().build(); } }
@Value("#{myRestTemplate}") private RestTemplate restTemplate;
靜態(tài)屬性賦值
spring 不允許/不支持把值注入到靜態(tài)變量。
@Value("${constants.test.string}") private static String value;
如上操作,最后變量value的結(jié)果是等于null值。
解決方法:
spring支持set方法注入,我們可以利用非靜態(tài)setter 方法注入靜態(tài)變量。
private static String value; @Value("${constants.test.string}") public void setValue(String value) { this.value = value; }
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
JAVA日常開(kāi)發(fā)中讀寫(xiě)XML的方法詳解
這篇文章主要介紹了JAVA日常開(kāi)發(fā)中讀寫(xiě)XML的相關(guān)資料,詳細(xì)講解了在Java中如何使用DOM(文檔對(duì)象模型)和SAX(簡(jiǎn)單API?for?XML)兩種方式讀取XML文件,以及如何使用DOM和JAXB(Java?Architecture?for?XML?Binding)兩種方式寫(xiě)入XML文件,需要的朋友可以參考下2024-12-12httpclient getPoolEntryBlocking連接池方法源碼解讀
這篇文章主要為大家介紹了httpclient getPoolEntryBlocking連接池方法源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11Java concurrency之Condition條件_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
Condition的作用是對(duì)鎖進(jìn)行更精確的控制。下面通過(guò)本文給大家分享Java concurrency之Condition條件的相關(guān)知識(shí),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2017-06-06Java的動(dòng)態(tài)代理模式之Cglib代理詳解
這篇文章主要介紹了Java的動(dòng)態(tài)代理模式之Cglib代理詳解,Cglib代理也叫作?子類(lèi)代理,它是在內(nèi)存中構(gòu)建一個(gè)子類(lèi)對(duì)象從而實(shí)現(xiàn)對(duì)目標(biāo)對(duì)象功能擴(kuò)展,?有些書(shū)也將Cglib代理歸屬到動(dòng)態(tài)代理,需要的朋友可以參考下2023-11-11如何通過(guò)XML方式配置并實(shí)現(xiàn)Mybatis
這篇文章主要介紹了如何通過(guò)XML方式配置并實(shí)現(xiàn)Mybatis,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11