簡體   English   中英

春季:在ID中使用命名空間的Bean與SPeL沖突

[英]Spring: beans using namespaces in IDs conflict with SPeL

Dhanji在他的有關依賴注入的書中鼓勵在命名Spring bean時使用名稱空間。

書中的引文:

我也強烈建議使用名稱空間,例如“ set.BinaryTree”和“ set.HashTable”,比“ binaryTreeSet”和“ hashTableSet”更易於閱讀和理解。 命名空間是鍵空間的一種更為優雅自然的命名方式,比起成組的大寫字母字符串,其可讀性更為突出。

現在聽起來很合理。 但是從SPeL開始 ,出現了沖突。 Ozzy曾經在Black Sabbath演出,所以對於每個樂隊成員,我都會在bean名稱中使用bs namespance,如下所示:

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

現在,我有另一個黑色安息日成員,他們將使用SpEL為歌曲名稱注入值。 ozzy播放的任何歌曲也將播放我的新成員(假設Tony):

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的書。
  • 我承認-我還沒有閱讀SpEL的整個文檔,也許解決方案要簡單得多

你可以這樣做:

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

我不確定上下文本身是否作為屬性/引用公開。

如果不是(仍在查找),則可以創建一個按名稱查找bean的函數,因此它看起來像這樣(或多或少):

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

即使您可以通過方法或使用字符串鍵通過映射查找通過ID獲得bean,我還是對這個想法有些“懷疑”,因為您可能會丟失一些IDE功能。

我想我更喜歡使用_ (下划線)命名空間。 使用點將大多數希望點成為屬性分隔符/方法調用的東西弄糟(很多東西)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM