Guice:类或实例级绑定注释

时间:2012-04-13 13:23:06

标签: java dependency-injection guice

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);

何时一种方法优先于另一种?似乎类级注释比实例级更加绝对/不灵活。两种方法的利弊/警告/陷阱?

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

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