Upload page content

You can upload content for the page named below. If you change the page name, you can also upload content for another page. If the page name is empty, we derive the page name from the file name.

File to load page content from
Page name
Comment

Locked History Actions

guice/Manual/UserGuide/Bindings/BindingAnnotations

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

同じ型について、複数のバインディングを指定したいこともある。 例えば、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})はユーザ(訳注:この場合はプログラマのこと)に対する注意である。@Paypalが意味の無い使われ方をするのを避けるため。
  • @Retention(RUNTIME)は実行時にアノテーションを利用できるようにするためのものである(訳注:必ずこれが必要)

アノテーションバインディングに依存させるには、注入されるパラメータにアノテーションを適用する。

public class RealBillingService implements BillingService {

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

最後にアノテーションを使ったバインディングを作成する。 annotatedWith句を使う。

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

@Named

Guiceにはビルトインのバインディングアノテーションの@Namedが用意されている。

public class RealBillingService implements BillingService {

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

特定の名前をバインドするには、Names.named()メソッドで得られたオブジェクトを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. アノテーション@interfaceを作成する。
  2. アノテーションインタフェースを実装するクラスを作成する。AnnotationのJavaDocに記述されているequals()とhashCode()のガイドラインに従うこと。そのオブジェクトをannotatedWith()に引き渡すこと。

訳注:どのように使うのか不明