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);
何时一种方法优先于另一种?似乎类级注释比实例级更加绝对/不灵活。两种方法的利弊/警告/陷阱?
答案 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)
唯一真正的区别在于,在一种情况下,您绑定整个注释,而在另一种情况下,您绑定到具有特定参数的注释。并非所有注释都采用参数,在这种情况下,与注释类的绑定是完全正常的。