假设有一个类A,它的构造函数是这样的:
public A(@Assited long id, @Assisten String name, ServiceA serviceA, ServiceB serviceB)
还有工厂:
public interface AFactory{
A create(long id, String name);
}
要创建A的实例我显然需要这样做:
injector = Guice.createInjector(new MyModule());
AFactory af = injector.getInstance(AFactory .class);
A a = AFactory.create(100, "mike");
,但假设我有其他类:类B、类C和类D,例如,它们有一个类型为a的成员(有字段注入,但也可以是tor):
public class B{
@Inject
A a;
}
我希望A的相同的实例将被注入到这些类中。但是仍然可以选择将A的另一个实例注入到其他类(假设是类E和类F)。
做那件事的正确方法是什么?
你可以构造你的模块来使用Providers(我在下面使用@ Providers方法,但是如果你愿意,你可以使用完整的Provider类或实例),并将一致的A标记为@Singleton。如果你想要A的两个绑定(一致的和不一致的),至少其中一个应该用绑定注释标记;为了方便,我在这里使用@Named
,但是您可以使用文档中列出的任何绑定注释。
public class AModule extends AbstractModule {
@Override public void configure() {
// Install your AFactory module. Here, injections for AFactory should succeed.
install(new FactoryModuleBuilder().build(AFactory.class));
}
/**
* Provides a singleton @Named("consistent") A.
* Inject @Named("consistent") A into B, C, and D; Guice will cache the instance.
*/
@Provides @Singleton @Named("consistent")
A provideConsistentA(AFactory factory) {
return factory.create(100, "mike");
}
/**
* Provides an unscoped A.
* Inject A without an annotation into E and F; each instance will be separate.
*/
@Provides @Singleton A provideUnscopedA(AFactory factory) {
return factory.create(200, "jeff");
}
}