我最近了解了 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 依赖。有没有办法做这种辅助注射还是需要我自己实现我的工厂?