Java GoogleGuice命名为vs注释
我正在浏览GoogleGuice文档,并阅读了有关它的信息。基本上有两种选择Java GoogleGuice命名为vs注释,java,dependency-injection,guice,Java,Dependency Injection,Guice,我正在浏览GoogleGuice文档,并阅读了有关它的信息。基本上有两种选择 @命名 绑定注释 我的问题是,哪一个更好 使用@命名我不必创建锅炉板来使用注释,但它以降低类型安全性为代价。注释代码看起来更干净。如前所述,您一般指定了绑定注释的优点和缺点。 你的陈述是正确的 @Named的另一个优点是使用Names.bindProperties绑定属性。 其中使用绑定注释是不相关的。 看 对于非目标绑定(听起来像是实际的问题),文档说明了两个选项 如果不想使用binding annotation/@
使用
@命名
我不必创建锅炉板来使用注释
,但它以降低类型安全性为代价。注释代码看起来更干净。如前所述,您一般指定了绑定注释的优点和缺点。你的陈述是正确的 @Named的另一个优点是使用Names.bindProperties绑定属性。 其中使用绑定注释是不相关的。 看 对于非目标绑定(听起来像是实际的问题),文档说明了两个选项 如果不想使用binding annotation/@Named,只需将绑定声明到具体类即可。
例如 您需要使用绑定注释/@命名您必须仍然添加目标绑定,即“.toSometing”方法(to、toProvider、toContractor等) 例如:
public class TestUntargetBinding {
@Test
void testTargetBindingViaImplementBy() {
final var injector = Guice.createInjector(new AbstractModule() {
@Override
public void configure() {
bind(MyConcreteClass.class)
.annotatedWith(Names.named("100"))
.toProvider(() -> new MyConcreteClass(100));
bind(MyConcreteClass.class)
.annotatedWith(Names.named("200"))
.toProvider(() -> new MyConcreteClass(200));
}
});
//imagine a class with a constructor
// @Inject
// SomeClass(@Named("100) MyConcreteClass myConcreteClass1){...}
final var myConcreteClass1 = injector.getInstance(Key.get(MyConcreteClass.class, Names.named("100")));
final var myConcreteClass2 = injector.getInstance(Key.get(MyConcreteClass.class, Names.named("200")));
assertThat(myConcreteClass1.doSomething(), Is.is(100));
assertThat(myConcreteClass2.doSomething(), Is.is(200));
}
static class MyConcreteClass {
private int i;
public MyConcreteClass(int i) {
this.i = i;
}
public int doSomething() {
return i;
}
}
}
Guice将不知道要将名称/注释绑定到哪个witch类,除非您指定“toProvider”您按照说明指定了绑定注释的一般利弊。
你的陈述是正确的 @Named的另一个优点是使用Names.bindProperties绑定属性。 其中使用绑定注释是不相关的。 看 对于非目标绑定(听起来像是实际的问题),文档说明了两个选项 如果不想使用binding annotation/@Named,只需将绑定声明到具体类即可。
例如 您需要使用绑定注释/@命名您必须仍然添加目标绑定,即“.toSometing”方法(to、toProvider、toContractor等) 例如:
public class TestUntargetBinding {
@Test
void testTargetBindingViaImplementBy() {
final var injector = Guice.createInjector(new AbstractModule() {
@Override
public void configure() {
bind(MyConcreteClass.class)
.annotatedWith(Names.named("100"))
.toProvider(() -> new MyConcreteClass(100));
bind(MyConcreteClass.class)
.annotatedWith(Names.named("200"))
.toProvider(() -> new MyConcreteClass(200));
}
});
//imagine a class with a constructor
// @Inject
// SomeClass(@Named("100) MyConcreteClass myConcreteClass1){...}
final var myConcreteClass1 = injector.getInstance(Key.get(MyConcreteClass.class, Names.named("100")));
final var myConcreteClass2 = injector.getInstance(Key.get(MyConcreteClass.class, Names.named("200")));
assertThat(myConcreteClass1.doSomething(), Is.is(100));
assertThat(myConcreteClass2.doSomething(), Is.is(200));
}
static class MyConcreteClass {
private int i;
public MyConcreteClass(int i) {
this.i = i;
}
public int doSomething() {
return i;
}
}
}
Guice不会知道要将名称/注释绑定到哪个witch类,除非您指定“toProvider”Guice链接提到
,因为编译器无法检查字符串,我们建议谨慎使用@Named。定义自己专门构建的注释可以提供更好的类型安全性。
有人能解释一下它所说的类型安全性吗?Guice link提到,由于编译器无法检查字符串,我们建议少用@Named。定义自己专门构建的注释可以提供更好的类型安全性。
有人能解释一下它所说的类型安全性吗?