1 回答
TA贡献1860条经验 获得超8个赞
我认为您对此并不十分清楚。所以让我解释一下。
首先,您创建了一个工厂,您将使用它来创建A. 您这样做是因为 Guice 不知道 parameter 的值name。
现在你想要的是创建一个B依赖于实例的实例A。您要求 Guice 为您提供一个实例B,但 Guice 将如何创建一个B没有实例的实例A?您还没有绑定 的任何实例A。
因此,要解决此问题,您要么必须B手动创建一个实例。
实现它的方法是遵循。
首先,你需要一个工厂B
public interface IBFactory {
IB create(String name);
}
然后你需要在你的类中进行以下更改B
public class B implements IB {
protected final A a;
@AssistedInject
public B(@Assisted String name, IAFactory iaFactory) {
this.a = iaFactory.create(name);
}
}
现在在你的main方法中
public static void main(String[] args) throws Exception {
if(args.size < 1) {
throw new IllegalArgumentException("First arg is required");
}
String name = args[0];
Injector injector = Guice.createInjector(new MyModule());
IBFactory ibFactory = injector.getInstance(IBFactory.class);
IB b = ibFactory.create(name)
System.out.println(b.getA().getName());
}
另外,不要忘记更新您的配置方法并安装 B 工厂。
protected void configure() {
install(new FactoryModuleBuilder()
.implement(IA.class, A.class)
.build(IAFactory.class));
install(new FactoryModuleBuilder()
.implement(IB.class, B.class)
.build(IBFactory.class));
}
请注意 ,我正在传递nameB 类。您可以更新 IBFactory 以作为辅助参数,然后首先创建外部使用IA的实例并将实例传递给以创建实例IAIAFactoryIAIBFactoryIB
添加回答
举报