我有一个界面
public interface ConfFileLoader {
public Map<String, Object> getResultMap() throws SecurityException, IOException;
}
和一个将其作为
的类public class ConfYamlLoader implements ConfFileLoader{
@Override
public Map<String, Object> getResultMap() throws SecurityException, IOException {
}
}
并且注入类为
public class AppInjector extends AbstractModule {
@Override
public void configure() {
bind(ConfFileLoader.class).to(ConfYamlLoader.class);
}
}
现在问题是我有一个班级
public class TI {
@Inject
private ConfFileLoader confFileLoader;
public void test(){
System.out.println("yeah tesrintY>>>>>>>>>>>>>>>>>>>"+confFileLoader);
}
}
它将异常作为
Exception in thread "main" com.google.inject.ConfigurationException: Guice configuration errors:
1) No implementation for com.exzeo.conf.ConfFileLoader was bound.
while locating com.exzeo.conf.ConfFileLoader
for field at com.exzeo.automate.HCPCI.TI.confFileLoader(TI.java:10)
while locating com.exzeo.automate.HCPCI.TI
但是当我做@ConfYamlLoader时它可以正常工作
public class TI {
@Inject
private ConfYamlLoader confFileLoader;
public void test(){
System.out.println("yeah tesrintY>>>>>>>>>>>>>>>>>>>"+confFileLoader);
}
}
以上课程正常
所以在调查中我发现当我在ConfFileLoader上添加@implemetedby时它可以正常工作
@ImplementedBy(ConfYamlLoader.class)
public interface ConfFileLoader {
public Map<String, Object> getResultMap() throws SecurityException, IOException;
}
我无法理解这种行为,如果我已经在绑定模块中绑定它,我需要做@ImplementedBy。按照我的理解,@ implementedby等于bind()。
如果我遗漏了任何内容并且使用的是guice版本3,请告诉我
答案 0 :(得分:1)
你的行
bind(ConfFileLoader.class).to(ConfYamlLoader.class);
表示“无论何时要注入类型为ConfFileLoader
的值,而是注入ConfYamlLoader
类型的值并使用该值。”
但你仍然需要以某种方式绑定ConfYamlLoader
以便可以注入它。
如果它有一个@Inject
- 带注释的构造函数,或者一个公共的无参数构造函数(除非你在某处调用了binder.requireAtInjectOnConstructors()
),那么Guice将使用它。
否则,您需要使用Provider<ConfYamlLoader>
方法或@Provides ConfYamlLoader
或bind(ConfYamlLoader).toProvider(...)
以某种方式绑定.toInstance(...)
。