如何绑定具体类?

新手上路,请多包涵

我有这个类:

 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 是具体类。现在,如果我想为这个场景实现一个模块,我会这样做:

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

但我想知道这是否是绑定具体类的正确方法,或者是否有更简单的方法。我觉得有一个更简单的方法。

原文由 helpermethod 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 278
2 个回答

Guice 的 即时绑定 完全满足您的需求。鉴于您的 DoorWindowRoof 满足以下要求(引自 Guice 文档):

一个公共的、无参数的构造函数,或者一个带有 @Inject 注释的构造函数

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

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

原文由 edwardw 发布,翻译遵循 CC BY-SA 3.0 许可协议

这是要走的路:

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

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

查看 Binder 文档,它指出:

 bind(ServiceImpl.class);

这个声明基本上什么都不做;它“将 ServiceImpl 类绑定到自身”并且不会更改 Guice 的默认行为。如果您更喜欢将您的 Module 类用作它提供的服务的显式清单,您可能仍想使用它。此外,在极少数情况下,Guice 可能无法在注入器创建时验证绑定,除非明确给出。

构造函数标记为 @Inject 的具体类自动可用于注入。但它可以帮助开发人员(您)了解模块中配置的内容。

原文由 Jalayn 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题