Google Guice:使用注入工厂实例化一个class中的多个对象?
Google Guice: use injected factory to instantiate multiple objects in a class?
public class AppModule extends AbstractModule {
@Override
protected void configure() {
install(new FactoryModuleBuilder().implement(BaseClass.class, ImplementingClass.class).build(FactoryClass.class));
}
}
public class AnotherClass {
@Inject
private FactoryClass factoryClass;
private BaseClass firstBaseObject = factoryClass.create("some_parameter");
private BaseClass secondBaseObject = factoryClass.create("another_parameter");
public void processSomething() {
// ... do something that requires both firstBaseObject and secondBaseObject to already be initialized on each call
}
}
有没有办法让我在每次调用 processSomething()
时都可以访问 firstBaseObject
和 secondBaseObject
? processSomething()
的每次调用都依赖于这两个已经实例化的对象,它们是具有大量元数据的巨大对象。也就是说,我能以某种方式确保 factoryClass
在命中这两行时已经实例化了吗?:
private BaseClass firstBaseObject = factoryClass.create("some_parameter");
private BaseClass secondBaseObject = factoryClass.create("another_parameter");
我在这两行上收到 NullPointerExceptions,因为 factoryClass
为空。
如果您需要更多信息,请告诉我,非常感谢!
使用以下代码
public class AnotherClass {
private final BaseClass firstBaseObject;
private final BaseClass secondBaseObject;
@Inject
public AnotherClass(FactoryClass factoryClass) {
firstBaseObject = factoryClass.create("some_parameter");
secondBaseObject = factoryClass.create("another_parameter");
}
public void processSomething() {
// ... do something that requires both firstBaseObject and secondBaseObject to already be initialized on each call
}
}
不能使用字段或方法注入,因为 factoryClass 中的注入是在填充 firstBaseObject 和 secondBaseObject 之后。
或
public class AppModule extends AbstractModule {
@Override
protected void configure() {
...
bind(BaseClass.class)
.annotatedWith(Names.named("firstBaseObject"))
.toInstance(factoryClass.create("some_parameter"));
bind(BaseClass.class)
.annotatedWith(Names.named("secondBaseObject"))
.toInstance(factoryClass.create("another_parameter"));
}
}
public class AnotherClass {
@Inject
@Named("firstBaseObject")
private BaseClass firstBaseObject;
@Inject
@Named("secondBaseObject")
private BaseClass secondBaseObject;
public void processSomething() {
// ... do something that requires both firstBaseObject and secondBaseObject to already be initialized on each call
}
}
public class AppModule extends AbstractModule {
@Override
protected void configure() {
install(new FactoryModuleBuilder().implement(BaseClass.class, ImplementingClass.class).build(FactoryClass.class));
}
}
public class AnotherClass {
@Inject
private FactoryClass factoryClass;
private BaseClass firstBaseObject = factoryClass.create("some_parameter");
private BaseClass secondBaseObject = factoryClass.create("another_parameter");
public void processSomething() {
// ... do something that requires both firstBaseObject and secondBaseObject to already be initialized on each call
}
}
有没有办法让我在每次调用 processSomething()
时都可以访问 firstBaseObject
和 secondBaseObject
? processSomething()
的每次调用都依赖于这两个已经实例化的对象,它们是具有大量元数据的巨大对象。也就是说,我能以某种方式确保 factoryClass
在命中这两行时已经实例化了吗?:
private BaseClass firstBaseObject = factoryClass.create("some_parameter");
private BaseClass secondBaseObject = factoryClass.create("another_parameter");
我在这两行上收到 NullPointerExceptions,因为 factoryClass
为空。
如果您需要更多信息,请告诉我,非常感谢!
使用以下代码
public class AnotherClass {
private final BaseClass firstBaseObject;
private final BaseClass secondBaseObject;
@Inject
public AnotherClass(FactoryClass factoryClass) {
firstBaseObject = factoryClass.create("some_parameter");
secondBaseObject = factoryClass.create("another_parameter");
}
public void processSomething() {
// ... do something that requires both firstBaseObject and secondBaseObject to already be initialized on each call
}
}
不能使用字段或方法注入,因为 factoryClass 中的注入是在填充 firstBaseObject 和 secondBaseObject 之后。
或
public class AppModule extends AbstractModule {
@Override
protected void configure() {
...
bind(BaseClass.class)
.annotatedWith(Names.named("firstBaseObject"))
.toInstance(factoryClass.create("some_parameter"));
bind(BaseClass.class)
.annotatedWith(Names.named("secondBaseObject"))
.toInstance(factoryClass.create("another_parameter"));
}
}
public class AnotherClass {
@Inject
@Named("firstBaseObject")
private BaseClass firstBaseObject;
@Inject
@Named("secondBaseObject")
private BaseClass secondBaseObject;
public void processSomething() {
// ... do something that requires both firstBaseObject and secondBaseObject to already be initialized on each call
}
}