1
Guice中@ImplementedBy批注背后的动机是什么?
我最近阅读了有关Google Guice中@ImplementedBy可用的注释的信息。它允许程序员指定接口与其实现之间的绑定,以供将来在依赖关系注入中使用。这是即时绑定的示例。 我已经习惯于使用以下语法在模块中定义显式绑定: bind(SomeInterface.class).to(SomeInterfaceImplementation.class); 根据文档,这等效于@ImplementedBy注释的以下用法: @ImplementedBy(SomeInterfaceImplementation.class) public interface SomeInterface { //method declarations } 我在这里看到的唯一好处是代码短了一点。同时,这种方法也有一个缺点,由相同的文档正确指出: @ImplementedBy小心使用;它从接口到其实现添加了编译时依赖性。 在许多情况下,这种依赖关系可能不是问题,但我个人认为这是代码的味道。 什么用例使@ImplementedBy注释值得使用? 一种可能的方法似乎是在库或框架的代码中使用它。如文档中所述,注释可以提供默认绑定,很容易被显式绑定覆盖。 如果一个类型同时在一个bind()语句(作为第一个参数)中并且具有@ImplementedBy注释,bind()则使用该语句。批注建议可使用绑定覆盖的默认实现。 这样,作为库的开发人员,我可以为用户提供现成的绑定,可以在客户端代码中的某个位置进行自定义。 这是注释存在的唯一原因吗?还是我想念的东西?我可以通过在只使用某些业务逻辑的应用程序而不是要扩展的库/框架的代码中使用它来获得任何收益吗?