1

我有一个界面

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

4

1 回答 1

1

你的线

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

意思是“每当你要注入一个 type 的值时ConfFileLoader,而是注入一个 type 的值ConfYamlLoader并使用它”。

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

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

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

于 2015-03-27T01:43:09.833 回答