![](/img/trans.png)
[英]How to create instance of a class which is created using guice factory assisted inject and is extended from an abstract class?
[英]Guice - Binding an instance created by assisted injection factory
让我们说A类的构造函数看起来像这样:
public A(@Assited long id, @Assisten String name, ServiceA serviceA, ServiceB serviceB)
还有AFactory:
public interface AFactory{
A create(long id, String name);
}
因此,要创建一个AI实例,显然需要做类似的事情:
injector = Guice.createInjector(new MyModule());
AFactory af = injector.getInstance(AFactory .class);
A a = AFactory.create(100, "mike");
但是,假设我有其他类:例如B类,C类和D类,其成员类型为A(具有字段注入但也可以是ctor):
public class B{
@Inject
A a;
}
我希望将相同的A 实例注入到这些类中。 但仍然可以选择将A的另一个实例注入其他类(比如说E类和F类)。
这样做的正确方法是什么? 我只是想不出干净的方法来做到这一点。
您可以将模块结构化为使用Providers(我在下面使用@Provides方法,但如果您愿意,可以使用完整的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");
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.