2011-11-12 47 views
0

Dhanji在其book about Dependnecy Injection中鼓勵在命名spring bean時使用名稱空間。Spring:使用ID中的名稱空間的bean與SPeL衝突

Qutation從書:

我也強烈鼓勵命名空間的使用,例如,「set.BinaryTree」和 「set.HashTable」,這是更好的閱讀和理解比「binaryTreeSet」 和「hashTableSet」。命名空間是您的關鍵空間的更優雅和自然的命名法,並且明顯比字符串分組的大寫字母 更可讀。

現在聽起來很合理。但是從SPeL開始,就產生了衝突。 奧茲用於黑色安息日玩,所以每一個樂隊成員,我將使用BS namespance在bean名字像這樣:

<bean id="bs.ozzy" 
    class="sk.spring.idol.annotation.Instrumentalist" 
    p:song="Sabbath Bloody Sabbath" /> 

現在我有黑色安息日的其他成員,誰將會對注入價值歌曲名稱使用SpEL。無論歌曲播放奧茲也將發揮我的新成員(比方說託尼):

public class Instrumentalist implements Performer { 

@Value("#{bs.ozzy.song}") 
private String song; 

// blabla other stuff, getters setters and so on 

}

現在我將要得到的是...

Expression parsing failed; nested exception is org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 0): Field or property 'bs' cannot be found on object 

現在什麼?有沒有什麼方法可以將文本轉義爲「這是bean名稱,並且不會將其評估爲屬性」?

注:

  • 的代碼示例由Dhanji的書的啓發。
  • 我承認 - 我沒有閱讀規劃環境地政司整個文檔,可能的解決方案是非常簡單得多

回答

0

我不知道如果上下文本身暴露爲屬性/引用。

如果它不(仍然在尋找),你可以只創建一個查找的名字一個bean的功能,所以它會這個樣子(或多或少):

@Value("#{byId('bs.ozzy').song}") 

即使你可以通過使用字符串鍵的方法或映射查找來獲得一個bean的bean,我對這個想法有些「懷疑」,因爲你可能會失去一些IDE功能。

我想我寧願使用_(下劃線)命名空間。使用點將大多數需要點的東西擰成屬性分隔符/方法調用(這是很多東西)。

+0

我同意,命名空間不應該有 「」作爲分隔符,如果使用SPeL的話。但是你知道,我們有很大的代碼庫,現在我們不應該使用SPeL或重寫這個東西。 :/ – Xorty

1

你可以這樣做:

@Value("#{ #this.getObject('bs.ozzy').song }")