假设我的类路径中的 jar 中有一个 A 类(即,我无法控制它的来源,因此不能简单地用 注释它@Inject
)。A 具有以下构造函数定义:
A(B b, C c) {
this.b = b;
this.c = c;
}
在我的代码库中,我有类:
BImpl implements B
和
CImpl implements C
我的问题是:如何配置 Guice 来管理要注入 BImpl 和 CImpl 的 A 实例(如果它甚至在框架范围内)?
假设我的类路径中的 jar 中有一个 A 类(即,我无法控制它的来源,因此不能简单地用 注释它@Inject
)。A 具有以下构造函数定义:
A(B b, C c) {
this.b = b;
this.c = c;
}
在我的代码库中,我有类:
BImpl implements B
和
CImpl implements C
我的问题是:如何配置 Guice 来管理要注入 BImpl 和 CImpl 的 A 实例(如果它甚至在框架范围内)?
当您说“jar 文件中的类 A”时,我假设您无法控制该类的源 - 您不能简单地添加@Inject
到构造函数中。
如果是这种情况,那么您可以Module
这样定义:
class MyModule extends AbstractModule {
@Override
protected void configure() {
bind(B.class).to(BImpl.class);
bind(C.class).to(CImpl.class);
try {
bind(A.class).toConstructor(A.class.getConstructor(B.class, C.class));
} catch (NoSuchMethodException e) {
throw new RuntimeException(e);
}
}
}
前两个绑定是标准的——您将接口类型绑定到实现类型。
最后一个绑定使用toConstructor
(从 Guice 3.0 开始),它允许您更轻松地“粘合”外部组件 - 就像您的情况一样。