Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Guice初学者-如何绑定具体类?_Java_Guice - Fatal编程技术网

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() {
    }
}