我正在尝试弄清楚 Guice 是如何工作的,并且正在努力寻找适合我的特定场景的示例/教程。
假设我有以下课程:
我遇到的问题是 ClassA 没有无参数构造函数,并且也有自己的依赖项。我不确定如何使用注入器注入这些类型的依赖项。
A级
public class ClassA {
private final int number;
private final ClassB classB;
@Inject
public ClassA(int number, ClassB classB) {
this.number = number;
this.classB = classB;
}
public String message() {
return "ClassA number: " + number + ", ClassB number: " + classB.getNumber();
}
}
B类
@Getter
public class ClassB {
private final int number;
@Inject
public ClassB(@Assisted int number) {
this.number = number;
}
}
C级
import com.google.inject.Inject;
import com.google.inject.assistedinject.Assisted;
public class ClassC {
final private int number;
final private ClassA classA;
@Inject
public ClassC(@Assisted int number, ClassA classA) {
this.number = number;
this.classA = classA;
}
public String message() {
String message = classA.messsage();
return message + ", ClassC number: " + number;
}
}
我有一个带有
create(int number)
方法的所有类的工厂接口。在模块配置方法中,我有以下内容:
install(new FactoryModuleBuilder().build(ClassAFactory.class));
install(new FactoryModuleBuilder().build(ClassBFactory.class));
install(new FactoryModuleBuilder().build(ClassCFactory.class));
以下是我完全迷失的地方,我该如何将它们混合在一起?
Injector injector = Guice.createInjector(new AppModule());
ClassBFactory bFactory = injector.getInstance(ClassBFactory.class);
ClassB b = bFactory.create(2);
ClassAFactory aFactory = injector.getInstance(ClassAFactory.class);
ClassA a = aFactory.create(1);
ClassCFactory cFactory = injector.getInstance(ClassCFactory.class);
ClassC c = cFactory.create(3);
System.out.println(c.message());
以上输出:
ClassA number: 3, ClassB number: 3, ClassC number: 3
对我来说,如果可以在这种情况下使用提供程序而不是工厂,请有人向我展示如何解决提供程序中的这些依赖关系的示例?
不管你信不信,这实际上是一个功能。它正在创建具有相同值的相应实例。
ClassBFactory bFactory = injector.getInstance(ClassBFactory.class);
ClassB b = bFactory.create(2);
这将创建一个新的
ClassB
实例,其 number
为 2
。
ClassAFactory aFactory = injector.getInstance(ClassAFactory.class);
ClassA a = aFactory.create(1);
ClassA
的构造函数采用number
和ClassB
的实例。但是,您在上面创建的 ClassB
实例未绑定,并且不可用于注入器。不过,由于 ClassB
可以使用辅助注射来创建,因此它能够创建一个。它会将其注入到
ClassA
的实例中。在这种情况下,
ClassA
和
ClassB
实例的
number
都是
1
。
ClassCFactory cFactory = injector.getInstance(ClassCFactory.class);
ClassC c = cFactory.create(3);
如上所述,这会为此新的 ClassB
创建新的
ClassA
和
ClassC
实例,每个实例的
number
为
3
。如果您想解决此问题,您需要更改工厂以采用正确的依赖项并创建这些依赖项
@Assisted
。
ClassBFactory bFactory = injector.getInstance(ClassBFactory.class);
ClassB b = bFactory.create(2);
ClassAFactory aFactory = injector.getInstance(ClassAFactory.class);
ClassA a = aFactory.create(1, b); // <--
ClassCFactory cFactory = injector.getInstance(ClassCFactory.class);
ClassC c = cFactory.create(3, a); // <--
如果您只想拥有这些类中的每一个的一个实例,那么最好在 Module
as
@Provides
方法中完成,而不是使用辅助注入和工厂:
@Provides
ClassA provideClassA(ClassB b) {
return new ClassA(1, b);
}
@Provides
ClassB provideClassB() {
return new ClassB(2);
}
@Provides
ClassC provideClassC(ClassA a) {
return new ClassC(3, a);
}