Guice Beginner - 如何绑定具体类?

时间:2011-12-13 08:52:15

标签: java guice

我有这堂课:

public class House {
    private final Door door;
    private final Window window;
    private final Roof roof;

    @Inject
    public House(Door door, Window window, Roof roof) {
        this.door = door;
        this.window = window;
        this.roof = roof;
    }
}

DoorWindowRoof是具体类别。现在,如果我想为这个场景实现一个模块,我会这样做:

public class HouseModule extends AbstractModule {
    @Override
    protected void configure() {
        bind(Door.class).to(Door.class);
        bind(Window.class).to(Window.class);
        bind(Roof.class).to(Roof.class);
    }
}

但我想知道这是否是绑定具体类的正确方法,或者是否有更简单的方法。我觉得有一种更简单的方法。

修改

试过这个,它似乎不起作用:

1) Binding points to itself.
  at de.tarent.guice.ex._1.HouseModule.configure(HouseModule.java:10)

编辑2

似乎根本不需要绑定:

Injector injector = Guice.createInjector();
House house = injector.getInstance(House.class);

似乎也有效。

3 个答案:

答案 0 :(得分:44)

这是要走的路:

protected void configure() {
    bind(Door.class);
    bind(Window.class);
    bind(Roof.class);
}

由于它们是具体的类,正如Guice所说,你不能将它们绑定到自己: - )

查看Binder文档,注意:

bind(ServiceImpl.class);
     

这句话基本上没有任何内容;它“将ServiceImpl类绑定到自身”并且不会改变Guice的默认行为。如果您希望将Module类作为其提供的服务的显式清单,您可能仍希望使用此功能。此外,在极少数情况下,Guice可能无法在注射器创建时验证绑定,除非明确给出。

具有标记为@Inject的构造函数的具体类可自动注入。但它有助于开发人员(您)知道模块中配置的内容。

答案 1 :(得分:28)

Guice的Just-In-Time binding完全符合您的要求。鉴于您的DoorWindowRoof符合以下要求(引自Guice documentation):

  

public,no-arguments构造函数或带@Inject批注的构造函数

空模块实现就足够了:

public class HouseModule extends AbstractModule {
    @Override
    protected void configure() {
    }
}

答案 2 :(得分:7)

链接接口和实现类需要绑定(例如,更改为测试环境中的其他实现)。但由于你有具体的类,不需要绑定,只需绑定类