2017-01-31 18 views
2

Guiceの公式文書を読んでいますが、バインディング注釈の章に関する質問があります。Guice:属性付きの注釈のバインド

Thisは、「属性を使用した注釈」について説明しています。しかし、私は説明が分からない。

属性

のGuiceと

バインディングアノテーションは、属性値を持つバインディングアノテーションをサポートしています。 このような注釈が必要なまれなケース:

アノテーション@interfaceを作成します。 注釈インターフェイスを実装するクラスを作成します。 Annotation Javadocで指定されたequals()および hashCode()のガイドラインに従います。 のインスタンスをannotatedWith()バインディング句に渡します。

私はその説明を理解できません。説明の目的は何ですか? @Paypal(この文書では)と@nameのような2つの注釈を学びました。しかし、おそらく、同じクラスに対して2つ以上の依存関係を使用したい場合、これらの2つのアノテーションでしか達成できないでしょうか? 今私は混乱している、誰も説明することができますか?

+0

可能な複製https://stackoverflow.com/questions/5704918/custom-guice-binding- annotations-with-parametersここの答えは良いです。 – Phil

答えて

5

のGuiceはあなたがの組み合わせのためだけの名前であるKeyを、使用して注入するために欲しいものを割り出しバインディングアノテーションをタイプ(自身が@BindingAnnotation@Qualifierで注釈されたアノテーション)(と必要に応じてパラメータ)。

  • YourClassOne
  • YourClassTwo
  • List<Integer>
  • List<String>
  • @Paypal YourClassOne
  • @Paypal YourClassTwo
  • @YourBindingAnnotation YourClassOne
  • :これらは、互いから、個別のすべての有効な鍵であります
  • @YourBindingAnnotation List<String>

10ただし、注釈は@Named("your name here")と同じように、属性を持つことが許可されています。つまり、キーはバインディングアノテーションだけでなく属性も異なります。彼らはすべて互いに異なっている

  • @Named("foo") YourClassOne
  • @Named("bar") YourClassOne
  • @AnotherBindingAnnotation(foo=3, bar=5) YourClassOne
  • @AnotherBindingAnnotation(foo=6, bar=1) YourClassOne

、及び:のは、上記のリストに属性でアノテーションを使用して、いくつかのキーを追加してみましょう彼らはGuiceに提供し、Guiceから注入するすべての有効なものです。一般的に

、あなたはおそらく属性を使用して独自のバインディングアノテーションを作成する必要はありません:バインディングアノテーションは、最初の場所でその一般的ではない、とあなたがそれらをしたい、ほとんどの場合は、空で扱うことができます(NO- (対応するNames.namedとともに、のAbstractModuleで使用できる注釈の互換性のあるインスタンスを作成する際に役立ちます)。ただし、属性を使用して独自のバインディングアノテーションを作成する場合は、特に、Annotation.equalsおよびAnnotation.hashCodeの要件に準拠して、引用を付けたドキュメントの一部を使用して作成することができます。 (これがたくさんできると思われる場合は、Apache Commons AnnotationUtilsなどのライブラリやGoogle Auto's AutoAnnotationなどのコードジェネレータを使用することを検討してください)

+0

ありがとうございます。あなたと文書で説明された 'Key'は、アノテーションとタイプの両方の組み合わせの名前です。例えば、 '@Paypal CreditCardProcessor'は' @ Paypal'という注釈と 'CreditCardProcessor'型を持っています。あなたの説明では、これらの4つの文字列 'Key'sはありますか? 'YourClassOne'、' YourClassTwo'、 'List '、 'List 'には注釈がありません。 –

+0

はい、アノテーションのないタイプは引き続きキーになります。私が列挙したものはStringsではないことに注意してください。通常、型や注釈はフィールドやコンストラクタのパラメータとして表示されますが、ファクトリメソッドの1つを使用してKeyを手動で作成する場合は、Typeオブジェクト(通常はClassまたはTypeLiteral)。 –

関連する問題