0

我最近了解了 Guice 的AssistedInject扩展,我认为它可以很好地解决我遇到的一些设计问题。不幸的是,该解决方案似乎仅限于一级辅助注射。这是我的问题的一个例子 - 假设我们有三个类:

public class AImpl implements A{

    @AssistedInject
    public AImpl(@Assisted Integer number, B b){

    }
}

public class BImpl implements B {

}

public class CImpl implements C {
    @AssistedInject
    public CImpl(A a){

    }
} 

工厂接口:

public interface CFactory {
    C create(Integer number);
}

和一个模块:

public class ABCModule extends AbstractModule {

    @Override
    protected void configure() {
        bind(A.class).to(AImpl.class);
        bind(B.class).to(BImpl.class);

        install(new FactoryModuleBuilder().implement(C.class, CImpl.class).build(CFactory.class));
    }

    public static void main(String[] args) {
        Guice.createInjector(new ABCModule()).getInstance(CFactory.class).create(123);
    }

}

以上失败并出现以下堆栈跟踪:

线程“主”com.google.inject.CreationException 中的异常:Guice 创建错误:

1) 在 stack.AImpl 中找不到合适的构造函数。类必须有一个(并且只有一个)用@Inject 注释的构造函数或一个非私有的零参数构造函数。在 stack.AImpl.class(AImpl.java:12) 在 stack.ABCModule.configure(ABCModule.java:14)

2) stack.CImpl 有@AssistedInject 构造函数,但它们都不匹配方法stack.CFactory.create() 中的参数。无法创建 AssistedInject 工厂。同时定位stack.CImpl 同时定位stack.C at stack.CFactory.create(CFactory.java:1)

在 com.google.inject.internal.InternalInjectorCreator.initializeStatically(InternalInjectorCreator.java:154) 在 com.google.inject.internal.InternalInjectorCreator 的 com.google.inject.internal.Errors.throwCreationExceptionIfErrorsExist(Errors.java:435) 有 2 个错误.build(InternalInjectorCreator.java:106) 在 com.google.inject.Guice.createInjector(Guice.java:95) 在 com.google.inject.Guice.createInjector(Guice.java:72) 在 com.google.inject。 Guice.createInjector(Guice.java:62) 在 stack.ABCModule.main(ABCModule.java:21)

这显然意味着我对扩展的要求太多了——我希望注入器会在依赖树的深处搜索@Assisted 依赖。有没有办法做这种辅助注射还是需要我自己实现我的工厂?

4

1 回答 1

0

您的代码有几个问题。您需要将“A”注入“C”,但您的工厂设置为注入整数

public interface CFactory {
    C create(Integer number);
}

另外我认为@AssistedInjectGuice没有提供注释。改为在构造函数上使用@Inject,并标记要传入的参数@Assisted

于 2014-12-25T22:46:01.033 回答