【译】Guice-BindingAnnotations

Binding Annotations

偶尔你会想要一个相同类型的多个绑定。例如,您可能需要一个PayPal信用卡处理器和Google Checkout处理器。要启用此功能,需要添加一个可选绑定的注释。注解和类型一起唯一标识绑定。这一对叫做“键”(key)。

定义绑定注解需要两行代码加上几个导入。 将其放在自己的.java文件或其注释的类型中。

1
2
3
4
5
6
7
8
9
10
11
12
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)表明注释在运行期间起作用。

要依赖注解的绑定,请将注解应用于注入的参数:

1
2
3
4
5
6
7
public class RealBillingService implements BillingService {

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

...
}

最后,我们创建一个使用注释的绑定,在bind()语句中使用可选的annotatedWith子句:

1
2
3
bind(CreditCardProcessor.class)
.annotatedWith(PayPal.class)
.to(PayPalCreditCardProcessor.class);

@Named

Guice带有一个内置的绑定注释@Named,它需要传入一个字符串值:

1
2
3
4
5
6
7
public class RealBillingService implements BillingService {

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

...
}

由于编译器无法检查字符串,我们建议少用@Named注解。 定义您自己的专用注解提供了更好的类型安全性。

Binding Annotations with Attributes

Guice支持具有属性值的绑定注解(如@Named)。在极少数情况下,您需要这样的注解(并且不能使用@Provides方法),我们建议您从Auto / Value项目中使用@AutoAnnotation,因为正确实现注解是容易出错的。如果您决定手动创建自定义实现,请务必正确实现Javadoc中详细说明的equals()和hashCode()规范 Annotation Javadoc。将此类的实例传递给annotatedWith()绑定子句。