在上一篇文章中Spring @Value 屬性注入使用總結(jié)一我們介紹了@Value的常用方式??赐晡恼履憧赡苊曰?{..}和${}有什么區(qū)別以及如何使用。這篇文章,我們嘗試解決這個(gè)問題
測(cè)試屬性文件:advance_value_inject.properties
server.name=server1,server2,server3#spelDefault.value=notdefaultHelloWorld_=sss
測(cè)試類AdvanceValueInject:引入advance_value_inject.properties文件,作為屬性的注入
@Component@PropertySource({"classpath:com/hry/spring/configinject/advance_value_inject.properties"})public class AdvanceValueInject {...}
#{…}用法
通過@Value(“${spelDefault.value}”)可以獲取屬性文件中對(duì)應(yīng)的值,但是如果屬性文件中沒有這個(gè)屬性,則會(huì)報(bào)錯(cuò)。可以通過賦予默認(rèn)值解決這個(gè)問題,如@Value("${spelDefault.value:127.0.0.1}")
詳細(xì)代碼如下:
// 如果屬性文件沒有spelDefault.value,則會(huì)報(bào)錯(cuò) // @Value("${spelDefault.value}") // private String spelDefault2; // 使用default.value設(shè)置值,如果不存在則使用默認(rèn)值 @Value("${spelDefault.value:127.0.0.1}") private String spelDefault;
${…}用法
${…}的{}里面的內(nèi)容必須符合SpEL表達(dá)式,詳細(xì)的語法,以后可以專門開新的文章介紹,這里只演示簡單用法:
// SpEL:調(diào)用字符串Hello World的concat方法 @Value("#{'Hello World'.concat('!')}") private String helloWorld; // SpEL: 調(diào)用字符串的getBytes方法,然后調(diào)用length屬性 @Value("#{'Hello World'.bytes.length}") private String helloWorldbytes;
${…}和#{…}混合使用
${...}和#{...}
可以混合使用,如下文代碼執(zhí)行順序:通過${server.name}從屬性文件中獲取值并進(jìn)行替換,然后就變成了 執(zhí)行SpEL表達(dá)式#{‘server1,server2,server3’.split(‘,’)}。
// SpEL: 傳入一個(gè)字符串,根據(jù)","切分后插入列表中, #{}和${}配置使用(注意單引號(hào),注意不能反過來${}在外面,#{}在里面) @Value("#{'${server.name}'.split(',')}") private List<String> servers;
在上文中在#{}外面,${}在里面
可以執(zhí)行成功,那么反過來是否可以呢${}在外面,#{}在里面
,如代碼
// SpEL: 注意不能反過來${}在外面,#{}在里面,這個(gè)會(huì)執(zhí)行失敗 @Value("${#{'HelloWorld'.concat('_')}}") private List<String> servers2;
答案是不能。因?yàn)?a title="Java EE知識(shí)庫" target="_blank" style="color:#df3434; font-weight:bold;">spring執(zhí)行${}是時(shí)機(jī)要早于#{}。在本例中,Spring會(huì)嘗試從屬性中查找#{‘HelloWorld’.concat(‘_’)},那么肯定找到,由上文已知如果找不到,然后報(bào)錯(cuò)。所以${}在外面,#{}在里面
是非法操作
小結(jié)
#{}外面,${}在里面
上文代碼見Github
聯(lián)系客服