我知道我的标题令人困惑。我很难总结我想问的问题。我的意思是有没有一种方法可以使用 guice 使用绑定(bind)方法注入(inject)实现接口(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)(linked 或 untargeted)起作用是因为模块显式引用它绑定(bind)的每个类,这允许 Guice 找到这些类。
- JIT bindings工作,因为他们要求他们实现的特定类,这也允许 Guice 找到这些类。
-
@ImplementedBy
注释之所以起作用,是因为一旦类 requested 被加载,它就会指向实现,因此 Guice 知道如何找到该类。
如果要编写一个 @Exports
注释,Guice 实际上必须已经找到 BClass
才能识别它提供 AInterface
,尽管在任何地方都没有明确引用 BClass
。虽然 class-path scanning存在解决方案,他们必须遍历类路径上的每个类,这需要一些时间,并且对于 Guice 悄悄地做是一件危险的事情。因此,对于您正在寻找的情况,要求某种显式绑定(bind)是最有意义的。
关于java - 用于绑定(bind)在 guice 中实现接口(interface)的类的注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21425350/