我有这门课:
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,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);
}
}
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文档,它注意到:
Run Code Online (Sandbox Code Playgroud)bind(ServiceImpl.class);这句话基本上没有任何意义 它"将
ServiceImpl类绑定到自身"并且不会改变Guice的默认行为.如果您希望将Module类作为其提供的服务的显式清单,您可能仍希望使用此方法.此外,在极少数情况下,Guice可能无法在注射器创建时验证绑定,除非明确给出.
具有标记为的构造函数的具体类@Inject可自动注入.但它有助于开发人员(您)知道模块中配置的内容.
edw*_*rdw 30
Guice的Just-In-Time绑定完全符合您的要求.鉴于您的要求Door,Window并Roof满足以下要求(引自Guice 文档):
公共,无参数构造函数或带有@Inject批注的构造函数
一个空的模块实现就足够了:
public class HouseModule extends AbstractModule {
@Override
protected void configure() {
}
}
Run Code Online (Sandbox Code Playgroud)