我知道我的标题令人困惑。我很难总结我想问什么。我的意思是有一种方法可以使用 guice 来注入(inject)使用绑定(bind)方法实现接口(interface) A 的类,其中注释位于实现接口(interface) A 的类中,而不是在配置方法中绑定(bind)它或在接口(interface) A 中添加 @ImplementedBy 注释.

更新

当我使用 guice 阅读教程时,为了规定某个类实现一个接口(interface),必须使用绑定(bind)。现在有很多方法可以执行绑定(bind)。其中的例子是:
链接绑定(bind):

bind(AInterface).to(Bclass);

此代码将位于扩展抽象模块的类的配置方法中。这告诉 guice 如果它们是需要 AInterface 的依赖项,它可能会注入(inject) BClass 来处理依赖项。

及时绑定(bind):
@ImplementedBy(BClass.class)
public interface AInterface {
}

此示例等效于链接绑定(bind)示例。

现在我读到的所有绑定(bind)都要求我在配置方法或接口(interface)中声明一个类实现了该接口(interface)。这将要求我在每次实现接口(interface)时编辑现有代码。我想要的是简单地让实现接口(interface)的类处理绑定(bind)本身,以免修改现有代码。

就像是
@Exports(AInterface.class)
public BClass implements AInterface{
}

最佳答案

没有办法做到这一点。

正如 RC 在评论中指出的那样,如果您有两个“@Exports”接口(interface)相同的类,Guice 将不知道该选择哪一个。此外,从类加载的角度考虑:

  • 显式绑定(bind)(linkeduntargeted )有效,因为 Module 显式引用它绑定(bind)的每个类,这允许 Guice 找到这些类。
  • JIT bindings 之所以起作用,是因为他们要求他们实现的特定类,这也允许 Guice 找到这些类。
  • @ImplementedBy 注释起作用,因为一旦请求的类被加载,它就指向实现,所以 Guice 知道如何找到那个类。

  • 如果要编写 @Exports 注释,Guice 实际上必须已经找到 BClass 才能识别它提供 AInterface ,尽管在任何地方都没有明确引用 BClass 。尽管存在 class-path scanning 解决方案,但它们必须遍历类路径上的每个类,这需要一些时间,而且对于 Guice 来说,默默地做是一件危险的事情。因此,为您正在寻找的案例需要某种显式绑定(bind)是最有意义的。

    10-07 16:50
    查看更多