谷歌的guice没有使用实现不工作

时间:2015-03-20 13:15:09

标签: java guice guice-3

我有一个界面

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,请告诉我

1 个答案:

答案 0 :(得分:1)

你的行

bind(ConfFileLoader.class).to(ConfYamlLoader.class);

表示“无论何时要注入类型为ConfFileLoader的值,而是注入ConfYamlLoader类型的值并使用该值。”

但你仍然需要以某种方式绑定ConfYamlLoader以便可以注入它。

如果它有一个@Inject - 带注释的构造函数,或者一个公共的无参数构造函数(除非你在某处调用了binder.requireAtInjectOnConstructors()),那么Guice将使用它。

否则,您需要使用Provider<ConfYamlLoader>方法或@Provides ConfYamlLoaderbind(ConfYamlLoader).toProvider(...)以某种方式绑定.toInstance(...)