全部
我对Google Guice有一些疑问。任何帮助表示赞赏。
我有一个处理程序接口及其实现。
public interface Handler {
void handle();
}
public class HandlerImpl implements Handler {
private Filter filterOne;
@Override
void handler() {
filterOne.foo();
}
}
过滤器是另一个接口:
public interface Filter {
void foo();
}
有多种实现。
public class FilterOne implements Filter {
void foo() {
}
}
public class FilterTwo implements Filter {
void foo() {
}
}
然后在我的Guice模块中:
public class HandlerModule extends AbstractModel {
@Override
protected void configure() {
bind(Handler.class).to(HandlerImpl.class);
}
@Provides
@Singleton
public Handler provideHandler(@Named("filterOne")filter filterOne) {
return new HandlerImpl(filterOne);
}
@Provides
@Singleton
@Named("filterOne")
public Filter provideFilterOne() {
return new FilterOne();
}
@Provides
@Singleton
@Named("filterTwo")
public Filter provideFilterTwo() {
return new FilterTwo();
}
}
通过上述实现,我总是会收到错误-在HandlerImpl中找不到合适的构造函数。类必须具有一个(并且只有一个)带有@Inject注释的构造函数或非私有的零参数构造函数。
我正在使用@Named来区分两个过滤器。我使用错了吗?是因为我有两种实现Filter的方法,而Guice在尝试提供HandlerImpl时无法告诉使用哪种方法?]
您两次绑定Handler.class
:
configure()
方法中:bind(Handler.class).to(HandlerImpl.class);
@Singleton
public Handler provideHandler(@Named("filterOne")filter filterOne) {
return new HandlerImpl(filterOne);
}
这些绑定中的第一个无效,因为HandlerImpl
没有以@Inject
注释的构造函数。如果您对其进行了修复,则仍然无法使用-您无法为同一个键提供多个绑定。
TL; DR:从bind(Handler.class).to(HandlerImpl.class);
方法中删除configure()