如何绑定具体类?

48

我有这个类:

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;
    }
}

假设 DoorWindowRoof 是具体类。现在,如果我想要为这种情况实现一个Module,我将这样做:

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);
    }
}

但我在想这是否是绑定具体类的正确方式,或者是否有更简单的方法。我感觉有更简单的方法。


你应该将自己的解决方案提交为答案并接受它。这是列表中最好的答案。根本不需要任何模块,甚至不需要空模块。 - Benny Bottema
3个回答

58

这是正确的方式:

protected void configure() {
    bind(Door.class);
    bind(Window.class);
    bind(Roof.class);
}

由于它们是具体类,正如Guice所说,您不能将它们绑定到自身 :-)

查看Binder文档,它指出:

bind(ServiceImpl.class);

This statement does essentially nothing; it "binds the ServiceImpl class to itself" and does not change Guice's default behavior. You may still want to use this if you prefer your Module class to serve as an explicit manifest for the services it provides. Also, in rare cases, Guice may be unable to validate a binding at injector creation time unless it is given explicitly.

标记为@Inject的构造函数的具体类会自动可用于注入。但这有助于开发人员(您)了解模块中配置了什么。


真的很困惑 - “自动在模块中可用”是指全局项目中的所有模块吗?还是它只能识别包本地模块,或者根据模块名称进行匹配? - djechlin
这仅意味着您甚至不需要指示绑定方式,因为 Door、Window 和 Roof 是具体类。它们在所有模块中都是可用的。如果您有给定接口的不同实现,那么您必须帮助 Guice。 - Jalayn
当您不需要将接口绑定到类时,就不需要模块。 - Noya
“可用于模块”是一个有点令人困惑的短语 - @Inject注释表示类自动可用于注入 - dimo414

31

Guice的Just-In-Time绑定正好可以满足您的需求。根据您的DoorWindowRoof符合以下要求(引用自Guice 文档):

具有公共的、无参数构造函数,或者具有@Inject注解的构造函数

一个空的Module实现就足够了:

public class HouseModule extends AbstractModule {
    @Override
    protected void configure() {
    }
}

空模块放在哪里?Guice 如何知道它们相关联? - djechlin
@djechlin 这将取决于您的应用程序配置。例如,基于 Play 的应用程序将期望此类模块文件位于根包中,或通过应用程序.conf 中的 play.modules.enabled 进行配置。 - Siddhartha

6

绑定是必要的,以链接接口和实现类(例如,在测试环境中更改为其他实现)。但由于您有具体的类,所以不需要绑定到接口,只需绑定类即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接