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は属性値付バインディングアノテーションをサポートしている。まれなケースであるが、このようなアノテーションが必要になるかもしれない。
- Create the annotation @interface.
- 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.