Locked History Actions

Diff for "guice/Manual/UserGuide/Bindings/BindingAnnotations"

Differences between revisions 2 and 3
Deletions are marked like this. Additions are marked like this.
Line 9: Line 9:
Defining a binding annotation requires two lines of code plus several imports. Put this in its own .java file or inside the type that it annotates. バインディングアノテーションの定義には、二行のコードと複数のimportが必要である。
これらをそれ自身の.javaファイルに入れるか、アノテートしたいタイプの中で定義する。
Line 24: Line 25:
You don't need to understand all of these meta-annotations, but if you're curious: これらのメタアノテーションについて理解する必要は無いが、以下に説明する。
Line 26: Line 27:
    * @BindingAnnotation tells Guice that this is a binding annotation. Guice will produce an error if ever multiple binding annotations apply to the same member.
    * @Target({FIELD, PARAMETER, METHOD}) is a courtesy to your users. It prevents @PayPal from being accidentally being applied where it serves no purpose.
    * @Retention(RUNTIME) makes the annotation available at runtime.
 * @BindingAnnotation Guiceにバインディングアノテーションであることを伝える。Guiceは一つのメンバーに複数のバインディングアノテーションが指定されている場合はエラーを発生する。
 * @Target({FIELD, PARAMETER, METHOD}) is a courtesy to your users. It prevents @PayPal from being accidentally being applied where it serves no purpose.
 * @Retention(RUNTIME) makes the annotation available at runtime.
Line 66: Line 67:
== Binding Annotations with Attributes == == 属性付バインディングアノテーション ==
Line 68: Line 69:
Guice supports binding annotations that have attribute values. In the rare case that you need such an annotation: Guiceは属性値付バインディングアノテーションをサポートしている。まれなケースであるが、このようなアノテーションが必要になるかもしれない。

バインディングアノテーション

同じ型について、複数のバインディングを指定したいこともある。 例えば、PayPal credit card processor と Google Checkout processorを使いたいとしよう。 これができるように、バインディングはバインディングアノテーションのオプションを用意している。 アノテーションとタイプの組はバインディングを一意に識別する。 この組をキーと呼ぶ。

バインディングアノテーションの定義には、二行のコードと複数のimportが必要である。 これらをそれ自身の.javaファイルに入れるか、アノテートしたいタイプの中で定義する。

package example.pizza;

import com.google.inject.BindingAnnotation;
import java.lang.annotation.Target;
import java.lang.annotation.Retention;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;

@BindingAnnotation @Target({ FIELD, PARAMETER, METHOD }) @Retention(RUNTIME)
public @interface PayPal {}

これらのメタアノテーションについて理解する必要は無いが、以下に説明する。

  • @BindingAnnotation はGuiceにバインディングアノテーションであることを伝える。Guiceは一つのメンバーに複数のバインディングアノテーションが指定されている場合はエラーを発生する。

  • @Target({FIELD, PARAMETER, METHOD}) is a courtesy to your users. It prevents @PayPal from being accidentally being applied where it serves no purpose.

  • @Retention(RUNTIME) makes the annotation available at runtime.

To depend on the annotated binding, apply the annotation to the injected parameter:

public class RealBillingService implements BillingService {

  @Inject
  public RealBillingService(@PayPal CreditCardProcessor processor,
      TransactionLog transactionLog) {
    ...
  }

Lastly we create a binding that uses the annotation. This uses the optional annotatedWith clause in the bind() statement:

    bind(CreditCardProcessor.class)
        .annotatedWith(PayPal.class)
        .to(PayPalCreditCardProcessor.class);

@Named

Guice comes with a built-in binding annotation @Named that uses a string:

public class RealBillingService implements BillingService {

  @Inject
  public RealBillingService(@Named("Checkout") CreditCardProcessor processor,
      TransactionLog transactionLog) {
    ...
  }

To bind a specific name, use Names.named() to create an instance to pass to annotatedWith:

    bind(CreditCardProcessor.class)
        .annotatedWith(Names.named("Checkout"))
        .to(CheckoutCreditCardProcessor.class);

Since the compiler can't check the string, we recommend using @Named sparingly.

属性付バインディングアノテーション

Guiceは属性値付バインディングアノテーションをサポートしている。まれなケースであるが、このようなアノテーションが必要になるかもしれない。

  1. Create the annotation @interface.
  2. Create a class that implements the annotation interface. Follow the guidelines for equals() and hashCode() specified in the Annotation Javadoc. Pass an instance of this to the annotatedWith() binding clause.