您的主要方法如下所示:
class TestApp {
public static void main(..) {
Injector injector = Guice.createInjector(new TestModule(), new AModule());
A obj = injector.getInstance(A.class);
}
注意,Java约定是将类名的第一个字母大写。
AModule
也不是在做你认为它在做的事情,但根据你提供的信息很难确定。很可能,您的意思是:
bind(AInterface.class).to(AImpl.class)`
没有必要对它做任何“特别”的事情
A
的绑定。Guice为您解决所有递归。这是其“魔力”的一部分。
annotatedWith()
与一起使用
to()
或
toInstance()
,如下所示:
bind(AInterface.class).to(AImpl.class).annotatedWIth(Foo.class);
bind(AInterface.class).to(ZImpl.class).annotatedWIth(Bar.class);
然后,您可以通过注释注入点来注入不同的实现,例如:
@Inject
MyInjectionPoint(@Foo AInterface getsAImpl, @Bar AInterface getsZImpl) {
....
}
还值得指出的是,您可以通过不使用绑定模块(取决于代码的排列方式)和使用JIT绑定来节省一些样板文件:
@ImplementedBy(AImpl.class)
public interface AInterface {
....
}
这些有效地充当“默认值”,如果存在显式绑定,则由显式绑定覆盖。