我最近了解到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);
}
}
上面的以下堆栈跟踪失败:
线程“main”中的异常com.google.inject.CreationException:Guice 创建错误:
1)无法在stack.AImpl中找到合适的构造函数。课程必须 有一个(只有一个)构造函数用@Inject或a注释 零私有构造函数。在 stack.AImpl.class(AImpl.java:12)at stack.ABCModule.configure(ABCModule.java:14)
2)stack.CImpl有@AssistedInject构造函数,但都没有 匹配方法stack.CFactory.create()中的参数。无法 创建AssistedInject工厂。同时定位stack.CImpl 在stack.CFactory.create(CFactory.java:1)
找到stack.C2个错误 com.google.inject.internal.Errors.throwCreationExceptionIfErrorsExist(Errors.java:435) 在 com.google.inject.internal.InternalInjectorCreator.initializeStatically(InternalInjectorCreator.java:154) 在 com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:106) 在com.google.inject.Guice.createInjector(Guice.java:95)at com.google.inject.Guice.createInjector(Guice.java:72)at com.google.inject.Guice.createInjector(Guice.java:62)at stack.ABCModule.main(ABCModule.java:21)
这显然意味着我对扩展程序要求太多 - 我希望注入器将在依赖树中深入搜索,以搜索@Assisted依赖项。有没有办法做这种辅助注射,还是我需要自己实施我的工厂?
答案 0 :(得分:0)
答案 1 :(得分:0)
您的代码有几个问题。你需要注射一个" A"进入" C"但你的工厂设置为注入一个整数
public interface CFactory {
C create(Integer number);
}
此外,我不认为Guice提供了@AssistedInject
注释。改为在构造函数上使用@Inject
,并使用@Assisted