0

Dhanji は、依存性注入に関する著書の中で、Spring Bean に名前を付けるときに名前空間を使用することを推奨しています。

本からの引用:

また、「set.BinaryTree」や「set.HashTable」など、「binaryTreeSet」や「hashTableSet」よりも読みやすく理解しやすい名前空間の使用を強くお勧めします。名前空間は、キー スペースのより洗練された自然な命名法であり、グループ化された大文字の単語の文字列よりもはるかに読みやすくなっています。

今ではそれは合理的に聞こえます。しかし、SPeLの時点で、競合が発生します。Ozzy は Black Sabbath で演奏していたので、すべてのバンド メンバーに対して、次のようにbs名前空間を Bean 名に使用します。

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

現在、SpEL を使用して曲名に値を挿入する予定の Black Sabbath のメンバーがもう 1 人います。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のドキュメント全体を読んでいません。おそらく解決策ははるかに簡単です
4

2 に答える 2

1

あなたはこれを行うことができます:

@Value("#{ #this.getObject('bs.ozzy').song }")
于 2012-04-17T10:01:26.930 に答える
0

コンテキスト自体がプロパティ/参照として公開されているかどうかはわかりません。

そうでない場合 (まだ探している)、名前で Bean を検索する関数を作成するだけで、次のようになります (多かれ少なかれ):

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

メソッドまたは文字列キーを使用したマップ ルックアップを介して id で Bean を取得できたとしても、IDE 機能の一部が失われる可能性があるため、私はその考えについて「まあ」です。

_(アンダースコア)を使用した名前空間を好むと思います。ドットを使用すると、ドットがプロパティセパレーター/メソッド呼び出しであると予想されるほとんどすべてが台無しになります (これは多くのものです)。

于 2011-11-12T17:50:10.477 に答える