下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第
PAGE
2
頁共
NUMPAGES
2
頁
SpringBoot2.動(dòng)態(tài)@Value的實(shí)現(xiàn)方式
importmon.collect.Sets;
importorg.springframework.beans.factory.config.BeanDefinition;
importorg.springframework.beans.factory.config.BeanExpressionContext;
importorg.springframework.beans.factory.config.ConfigurableBeanFactory;
importorg.springframework.beans.factory.config.Scope;
importorg.springframework.util.StringUtils;
importjava.util.Set;
importjava.util.Stack;
*Placeholderhelperfunctions.
publicclassPlaceholderHelper{
privatestaticfinalStringPLACEHOLDER_PREFIX="${";
privatestaticfinalStringPLACEHOLDER_SUFFIX="}";
privatestaticfinalStringVALUE_SEPARATOR=":";
privatestaticfinalStringSIMPLE_PLACEHOLDER_PREFIX="{";
privatestaticfinalStringEXPRESSION_PREFIX="#{";
privatestaticfinalStringEXPRESSION_SUFFIX="}";
*Resolveplaceholderpropertyvalues,e.g.
*br/
*br/
*"${somePropertyValue}"-"theactualpropertyvalue"
publicObjectresolvePropertyValue(ConfigurableBeanFactorybeanFactory,StringbeanName,Stringplaceholder){
//resolvestringvalue
StringstrVal=beanFactory.resolveEmbeddedValue(placeholder);
BeanDefinitionbd=(beanFactory.containsBean(beanName)beanFactory
.getMergedBeanDefinition(beanName):null);
//resolveexpressionslike"#{systemProperties.myProp}"
returnevaluateBeanDefinitionString(beanFactory,strVal,bd);
privateObjectevaluateBeanDefinitionString(ConfigurableBeanFactorybeanFactory,Stringvalue,
BeanDefinitionbeanDefinition){
if(beanFactory.getBeanExpressionResolver()==null){
returnvalue;
Scopescope=(beanDefinition!=nullbeanFactory
.getRegisteredScope(beanDefinition.getScope()):null);
returnbeanFactory.getBeanExpressionResolver()
.evaluate(value,newBeanExpressionContext(beanFactory,scope));
*Extractkeysfromplaceholder,e.g.
*ul
*li${some.key}="some.key"/li
*li${some.key:${some.other.key:100}}="some.key","some.other.key"/li
*li${${some.key}}="some.key"/li
*li${${some.key:other.key}}="some.key"/li
*li${${some.key}:${another.key}}="some.key","another.key"/li
*li#{newjava.text.SimpleDateFormat('${some.key}').parse('${another.key}')}="some.key","another.key"/li
*/ul
publicSetStringextractPlaceholderKeys(StringpropertyString){
SetStringplaceholderKeys=Sets.newHashSet();
if(!isNormalizedPlaceholder(propertyString)!isExpressionWithPlaceholder(propertyString)){
returnplaceholderKeys;
StackStringstack=newStack();
stack.push(propertyString);
while(!stack.isEmpty()){
StringstrVal=stack.pop();
intstartIndex=strVal.indexOf(PLACEHOLDER_PREFIX);
if(startIndex==-1){
placeholderKeys.add(strVal);
continue;
intendIndex=findPlaceholderEndIndex(strVal,startIndex);
if(endIndex==-1){
//invalidplaceholder
continue;
StringplaceholderCandidate=strVal.substring(startIndex+PLACEHOLDER_PREFIX.length(),endIndex);
//${some.key:other.key}
if(placeholderCandidate.startsWith(PLACEHOLDER_PREFIX)){
stack.push(placeholderCandidate);
}else{
//some.key:${some.other.key:100}
intseparatorIndex=placeholderCandidate.indexOf(VALUE_SEPARATOR);
if(separatorIndex==-1){
stack.push(placeholderCandidate);
}else{
stack.push(placeholderCandidate.substring(0,separatorIndex));
StringdefaultValuePart=
normalizeToPlaceholder(placeholderCandidate.substring(separatorIndex+VALUE_SEPARATOR.length()));
if(!Strings.isNullOrEmpty(defaultValuePart)){
stack.push(defaultValuePart);
//hasremainingpart,e.g.${a}.$
if(endIndex+PLACEHOLDER_SUFFIX.length()strVal.length()-1){
StringremainingPart=normalizeToPlaceholder(strVal.substring(endIndex+PLACEHOLDER_SUFFIX.length()));
if(!Strings.isNullOrEmpty(remainingPart)){
stack.push(remainingPart);
returnplaceholderKeys;
privatebooleanisNormalizedPlaceholder(StringpropertyString){
returnpropertyString.startsWith(PLACEHOLDER_PREFIX)propertyString.endsWith(PLACEHOLDER_SUFFIX);
privatebooleanisExpressionWithPlaceholder(StringpropertyString){
returnpropertyString.startsWith(EXPRESSION_PREFIX)propertyString.endsWith(EXPRESSION_SUFFIX)
propertyString.contains(PLACEHOLDER_PREFIX);
privateStringnormalizeToPlaceholder(StringstrVal){
intstartIndex=strVal.indexOf(PLACEHOLDER_PREFIX);
if(startIndex==-1){
returnnull;
intendIndex=strVal.lastIndexOf(PLACEHOLDER_SUFFIX);
if(endIndex==-1){
returnnull;
returnstrVal.substring(startIndex,endIndex+PLACEHOLDER_SUFFIX.length());
privateintfindPlaceholderEndIndex(CharSequencebuf,intstartIndex){
intindex=startIndex+PLACEHOLDER_PREFIX.length();
intwithinNestedPlaceholder=0;
while(indexbuf.length()){
if(StringUtils.substringMatch(buf,index,PLACEHOLDER_SUFFIX)){
if(withinNestedPlaceholder0){
withinNestedPlaceholder--;
index=index
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年湖南勞動(dòng)人事職業(yè)學(xué)院?jiǎn)握新殬I(yè)傾向性測(cè)試題庫及答案1套
- 2026年哈爾濱應(yīng)用職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試模擬測(cè)試卷及答案1套
- 2025廣東省疾病預(yù)防控制中心招聘科研助理1人(公共基礎(chǔ)知識(shí))測(cè)試題附答案
- 2026寧波市江北區(qū)面向2026屆高校畢業(yè)生招聘高層次和緊缺人才13人筆試參考題庫及答案解析
- 2025年甘肅省定西市隴西縣福星中心衛(wèi)生院高塄分院招聘鄉(xiāng)村醫(yī)生(公共基礎(chǔ)知識(shí))綜合能力測(cè)試題附答案
- 2026中國安能集團(tuán)科工有限公司招聘6人筆試參考題庫及答案解析
- 2025河南省人力資源開發(fā)中心有限公司招聘1人考試題庫附答案
- 2025年甘肅省隴南師范學(xué)院第二批高層次人才和急需緊缺專業(yè)技術(shù)人才引進(jìn)(20人)參考題庫附答案
- 2025廣東廣州市天河區(qū)靈秀小學(xué)招聘英語教師1人(學(xué)校自籌經(jīng)費(fèi))考試歷年真題匯編附答案
- 2025年保山市部分醫(yī)療衛(wèi)生事業(yè)單位招聘博士研究生(10人)筆試備考題庫附答案
- 廣東省大灣區(qū)2023-2024學(xué)年高一上學(xué)期期末生物試題【含答案解析】
- 第四單元地理信息技術(shù)的應(yīng)用課件 【高效課堂+精研精講】高中地理魯教版(2019)必修第一冊(cè)
- 魯科版高中化學(xué)必修一教案全冊(cè)
- 提高隧道初支平整度合格率
- 2023年版測(cè)量結(jié)果的計(jì)量溯源性要求
- 建筑能耗與碳排放研究報(bào)告
- GB 29415-2013耐火電纜槽盒
- 中國古代經(jīng)濟(jì)試題
- 軟件定義汽車:產(chǎn)業(yè)生態(tài)創(chuàng)新白皮書
- 磷石膏抹灰專項(xiàng)施工方案
- 水電水利工程施工質(zhì)量管理培訓(xùn)講義
評(píng)論
0/150
提交評(píng)論