我有这堂课:
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;
}
}
Door
,Window
和Roof
是具体类别。现在,如果我想为这个场景实现一个模块,我会这样做:
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);
似乎也有效。
答案 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完全符合您的要求。鉴于您的Door
,Window
和Roof
符合以下要求(引自Guice documentation):
public,no-arguments构造函数或带@Inject批注的构造函数
空模块实现就足够了:
public class HouseModule extends AbstractModule {
@Override
protected void configure() {
}
}
答案 2 :(得分:7)
链接接口和实现类需要绑定(例如,更改为测试环境中的其他实现)。但由于你有具体的类,不需要绑定到,只需绑定类