class ClassA {
protected ClassA(Injector baseGraph,
BlobStoreContext context,
SwiftApi api,
@Memoized Supplier<Set<? extends Location>> locations,
@Assisted String regionId,PayloadSlicer slicer,
@Named(PROPERTY_USER_THREADS) ListeningExecutorService userExecutor) {
}
}
class ClassB extends ClassA {
protected ClassB(Injector baseGraph,
BlobStoreContext context,
SwiftApi api,
@Memoized Supplier<Set<? extends Location>> locations,
@Assisted String regionId,
PayloadSlicer slicer,
@Named(PROPERTY_USER_THREADS) ListeningExecutorService userExecutor) {
super(baseGraph, context, api, locations, regionId, slicer, userExecutor);
}
}
class C extends AbstractModule {
protected void configure() {
bind(classA).to(classB);
}
}
绑定时构造函数参数中存在一些问题。
获取时出错
由com.google.inject.CreateException引起:Guice创建错误:
1) 没有绑定用@com.google.inject.assistantedject.Assistanted(value=)注释的java.lang.String的实现。查找用@com.google.inject.assistantedject.Assistanted(value=)注释的java.lang.String时对于的参数4
@Assisted
用于辅助注入的上下文,这是一个Guice功能,它自动为您实现一个工厂,该工厂将常规构造函数参数与Guice提供的参数注入混合在一起。例如,这里:
class ClassB extends ClassA {
protected ClassB(Injector baseGraph,
BlobStoreContext context,
SwiftApi api,
@Memoized Supplier<Set<? extends Location>> locations,
@Assisted String regionId,
PayloadSlicer slicer,
@Named(PROPERTY_USER_THREADS) ListeningExecutorService userExecutor) {
super(baseGraph, context, api, locations, regionId, slicer, userExecutor);
}
}
我希望看到这个界面:
public interface ClassBFactory {
ClassB create(String regionId);
}
然后将其绑定到AbstractModule子类中,如下所示:
install(new FactoryModuleBuilder().build(ClassBFactory.class));
然后,Guice可以检查ClassBFactory接口,观察ClassB
返回值,将create
的String regionId
参数与构造函数的@Assisted String regionId
参数匹配,然后将此ClassBFactory
实例提供给图。此时,不是注入ClassB
,而是注入ClassBFactory
,然后调用classBFactory.create("foo")
来创建ClassB
,其regionId
设置为"foo"
。
但是,如果您尝试注入ClassB
而不是ClassBFactory
,则Guice不会对@Assisted
注释进行任何特殊处理,并且将无法注入该字段。搜索你的代码库,看看是否存在工厂接口,如果不存在,你需要创建一个(或者重新设计你的构造函数)。