Guice - 当你所知道的是接口时,如何获取实例

时间:2011-06-03 20:07:50

标签: java guice

在我发现的所有Guice示例中,获取实例涉及使用具体类作为参数调用Injector.getInstance()。有没有办法只使用接口从Guice获取实例?

public interface Interface {}
public class Concrete implements Interface {}

Interface instance = injector.getInstance(Interface.class);

由于

3 个答案:

答案 0 :(得分:8)

实际上,这正是Guice的目的。

为了使getInstance()与接口一起工作,您需要首先在模块中绑定该接口的实现。

所以你需要一个看起来像这样的类:

public class MyGuiceModule extends AbstractModule {

    @Override
    protected void configure() {
        bind(Interface.class).to(Concrete.class);
    }
}

然后,当您创建注射器时,您只需要传递模块的实例:

Injector injector = Guice.createInjector(new MyGuiceModule());

现在,您对injector.getInstance(Interface.class)的调用应使用默认构造函数返回Concrete的新实例。

当然,还有很多方法可以进行绑定,但这可能是最直接的。

答案 1 :(得分:0)

它也适用于界面:

bind( Interface.class ).to( Concrete.class );

答案 2 :(得分:0)

不使用Module,您也可以直接在接口声明中指定默认使用的实现类:

@ImplementedBy(Concrete.class)
public interface Interface {}

这并不一定适合所有情况,但我发现这在大多数时候都派上用场了。

另外,在使用@ImplementedBy注释时,您仍然可以通过绑定Module中的另一个具体类来覆盖实现类。这也很有用。