0

Guice 提供了所谓的绑定注解的两种变体,它们似乎真的分解为类和实例级别的注解:

“班级级别”:

bind(Service.class).annotatedWith(Red.class).to(RedServiceImpl.class);

@Red
public class SomeService implements Service { ... }

Service redSvc = injector.getInstance(SomeService.class);

“实例级”:

bind(Service.class).annotatedWith(Names.named("Blue").to(BlueServiceImpl.class);
@Blue blueSvc = injector.getInstance(Service.class);

什么时候一种方法优先于另一种?似乎类级别的注释比实例级别的更绝对/不灵活。任何一种方法的优点/缺点/警告/陷阱?

4

2 回答 2

1

我不确定我是否理解你的问题。您对绑定注释的使用是不规则的。您通常不会注释局部变量或类,而是注释字段和参数。

您的第一个代码示例导致注入器返回 SomeService,但不是因为您的注释或绑定,而是因为 SomeService 是一个具体的实现。您是否要求这样做:

Service redSvc = injector.getInstance(Service.class);

你会得到一个错误:

1) No implementation for com.example.Service was bound.
  while locating com.example.Service

你的第二个例子也不正确。如果使用Names来定义绑定,则必须使用@Named来访问该绑定。使用@Blue会导致编译器错误。正确的用法是@Named(value="Blue").

绑定注释的常见最佳实践是:

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

在这种情况下,这两个都是编译错误:

@Red // not allowed
public class SomeService implements Service { ... }

@Blue // not allowed
blueSvc = injector.getInstance(Service.class);
于 2012-04-15T04:08:57.303 回答
0

唯一真正的区别是,在一种情况下,您绑定整个注释,而在另一种情况下,您绑定到具有特定参数的注释。并非所有注解都带有参数,在这种情况下,与注解类绑定是完全正常的。

于 2012-04-13T14:37:24.510 回答