Java Guice初学者-如何绑定具体类?
我有这门课:Java Guice初学者-如何绑定具体类?,java,guice,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;
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;
}
}
其中,门
、窗
和屋顶
为混凝土类。现在,如果我想为这个场景实现一个模块,我会这样做:
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);
也似乎有效。这是一条路:
protected void configure() {
bind(Door.class);
bind(Window.class);
bind(Roof.class);
}
正如Guice所说,因为它们是具体的类,所以不能将它们绑定到自身:-)
查看文档,它注意到:
这一声明基本上没有任何作用;它“将ServiceImpl
类绑定到自身”,并且不会更改Guice的默认行为。如果您希望您的模块
类作为它提供的服务的显式清单,那么您可能仍然希望使用它。此外,在极少数情况下,除非显式给出绑定,否则Guice可能无法在注入器创建时验证绑定
构造函数标记为的混凝土类自动可用于注入。但它可以帮助开发人员(您)知道模块中配置了什么。需要绑定来链接接口和实现类(例如,在测试环境中更改为其他实现)。但是,由于您有具体的类,因此不需要将绑定到,只需绑定类即可。鉴于您的
门
,窗
和屋顶
符合以下要求(引自指南):
公共的无参数构造函数或带有@Inject注释的构造函数
空模块实现就足够了:
public class HouseModule extends AbstractModule {
@Override
protected void configure() {
}
}
真的很困惑-是否“在模块中自动可用”对您的项目中的所有模块都是全局的?或者它是否知道包本地模块,或者它是否根据模块名称或其他内容进行匹配?这意味着您甚至不必指示如何绑定,因为门、窗和屋顶都是具体的类。它们在所有模块中都可用。如果您对给定接口有不同的实现,那么您必须帮助Guice。当您不需要将接口绑定到类时,您就不需要模块。“模块中可用”是一个令人困惑的短语,
@Inject
注释意味着类自动可供注入。空模块去哪里了?Guice如何知道它们之间的关系?@djechlin这将取决于应用程序的配置方式。例如,基于应用程序的应用程序希望此类模块文件位于根包中,或通过应用程序中的play.modules.enabled
进行配置。您应该提交自己的解决方案作为答案并接受该答案。这是列表中最好的答案。根本不需要模块,甚至不需要空模块。
public class HouseModule extends AbstractModule {
@Override
protected void configure() {
}
}