【问题标题】:Annotation to bind a class that implements an interface in guice在guice中绑定实现接口的类的注解
【发布时间】:2014-01-29 08:05:53
【问题描述】:

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

更新

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

bind(AInterface).to(Bclass); 

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

即时绑定:

@ImplementedBy(BClass.class)
public interface AInterface {
}

此示例等效于链接绑定示例。

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

类似

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

【问题讨论】:

  • 您能详细说明一下吗?也许发布一些代码示例来显示您想要做什么(如果显示意图,伪代码或无法编译的代码就可以了)
  • 我已经更新了我的问题。我希望现在更清楚了。
  • 我不认为你能做到这一点,AInterface 的实现可以有很多,所以哪一个被注释,如果两个被注释怎么办,......另外,你的BClass 应该明确实现AInterface
  • 抱歉忘记显式实现。我知道可以有很多实现。我只是觉得如果我决定使用不同的实现,更新现有代码会很麻烦。但如果没有其他办法,我想我别无选择。
  • 改变实现:正常方式,你改变现有的bind;按照您的方式,您从现有注释中删除注释(即现有代码!)并将其添加到新实现中。我看不出难度或工作量有什么不同

标签: java guice


【解决方案1】:

没有办法做到这一点。

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

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

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

【讨论】:

  • stackoverflow.com/questions/6085200/… 描述了一种模糊相关的方法,如何通过查看 BClass 来自动检测 AInterface,这可能可以用来想出一些东西来编写上面所寻求的自动魔法 IFF BClass 无论如何已经连接到其他地方.
猜你喜欢
  • 2022-09-10
  • 1970-01-01
  • 2014-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多