Guice Beginner - 如何绑定具体类?

hel*_*hod 42 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

其中Door,WindowRoof是具体的类.现在,如果我想为这个场景实现一个模块,我会这样做:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

编辑

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

1) Binding points to itself.
  at de.tarent.guice.ex._1.HouseModule.configure(HouseModule.java:10)
Run Code Online (Sandbox Code Playgroud)

编辑2

似乎根本不需要绑定:

Injector injector = Guice.createInjector();
House house = injector.getInstance(House.class);
Run Code Online (Sandbox Code Playgroud)

似乎也工作.

Jal*_*ayn 49

这是要走的路:

protected void configure() {
    bind(Door.class);
    bind(Window.class);
    bind(Roof.class);
}
Run Code Online (Sandbox Code Playgroud)

因为他们是具体的课程,正如Guice所说,你不能把它们绑在自己身上:-)

查看Binder文档,它注意到:

bind(ServiceImpl.class);
Run Code Online (Sandbox Code Playgroud)

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

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


edw*_*rdw 30

Guice的Just-In-Time绑定完全符合您的要求.鉴于您的要求Door,WindowRoof满足以下要求(引自Guice 文档):

公共,无参数构造函数或带有@Inject批注的构造函数

一个空的模块实现就足够了:

public class HouseModule extends AbstractModule {
    @Override
    protected void configure() {
    }
}
Run Code Online (Sandbox Code Playgroud)


kor*_*fey 6

链接Interface和Implementation类需要绑定(例如,更改为测试环境中的其他实现).但既然你有具体的课程,无需绑定,只要绑定类