Java 如何让Guice管理jar中的类(如果可能的话)?

Java 如何让Guice管理jar中的类(如果可能的话)?,java,dependency-injection,guice,Java,Dependency Injection,Guice,假设我的类路径中有一个jar中的类a(也就是说,我无法控制它的源代码,因此不能简单地用@Inject注释它)。具有以下构造函数定义: A(B b, C c) { this.b = b; this.c = c; } 在我的代码库中,我有以下类: BImpl implements B 及 我的问题是:如何配置Guice来管理要注入BImpl和CImpl的实例(如果它甚至在框架的范围内)?当您说“jar文件中的类A”时,我假设您无法控制该类的源代码-您不能简单地将@Inject添加

假设我的类路径中有一个jar中的类a(也就是说,我无法控制它的源代码,因此不能简单地用
@Inject
注释它)。具有以下构造函数定义:

A(B b, C c) {
    this.b = b;
    this.c = c;
}
在我的代码库中,我有以下类:

BImpl implements B

我的问题是:如何配置Guice来管理要注入BImpl和CImpl的实例(如果它甚至在框架的范围内)?

当您说“jar文件中的类A”时,我假设您无法控制该类的源代码-您不能简单地将
@Inject
添加到构造函数中

如果是这种情况,那么您可以这样定义
模块

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以来),这使得您可以更轻松地“粘合”外部组件,就像您的情况一样。

是的,这个假设是正确的。我将更新问题主体以更清楚地反映这一点。您是否也可以为A为b和c提供设置器而不是非默认构造函数的情况提供答案?@ChryCheng:对不起,不是。对于成员(即字段、方法),没有像
toConstructor
这样简单的事情。您必须注册一个
TypeListener
和一个
MembersInjector
,如中所述。我来看看。谢谢
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);
        }
    }
}