Guice的@ImplementedBy是邪恶的吗?在某些情况下是否合适?

| 我听说有人声称“ @ImplementedBy是邪恶的”,理由是它破坏了DI概念并使该接口意识到其实现者。 在某些情况下这可能是正确的,但是我经常发现这只会导致代码更简洁(无需维护很长时间的模块),而实际上并没有损害过程中的任何内容。 作为务实而不是纯粹主义者,您何时认为值得使用@ImplementedBy?     
已邀请:
        我同时具有@ImplementedBy但同样的ugh,ick,yuck感觉,这非常有用。 Spring必须扫描您提供的包列表中的所有类。在Guice中,您不必配置要扫描的软件包列表,而@ImplementedBy是这样做的关键(如果不使用Binder进行绑定的话)。当它沿着第一个Injector.getInstance的对象层次结构下降并命中一个接口时,它随后使用@ImplementedBy查找默认实现(只要Binder中没有任何东西可以覆盖该默认值)。 我们也使用@ImplementedBy。我们发现它非常好用,虽然有点笨拙,但它确实可以正常工作,而且由于它是DI,因此它实际上并不取决于实现,因为无论如何您都可以用新的重写绑定。 同时,DI框架通常越来越少使用接口。所有的DAO接口在我们的项目中都消失了,我们仍然可以为DAO交换模拟对象。 Java类是隐式接口,可以从此隐式接口开始进行模拟,而无需该接口。现在,我们将主要api的接口使用情况保留得很清楚,并且不会因实现代码而混乱。对于DAO,我们不再需要此功能。     
        通常,您应该更喜欢显式绑定而不是即时(JIT)绑定。显式绑定允许注入器在注入器创建时爬行依存关系图。如果依赖项丢失或无效,这可使Guice快速执行故障。使用@ImplementedBy之类的即时绑定,Guice在执行绑定之前无法报告问题。 JIT绑定与PrivateModules /子注入器的交互也很差。尽管大多数应用程序不需要这些功能,但是如果每个绑定都属于一个特定的模块,那么当您这样做时,就不会那么痛苦了。     
        当一个接口不打算具有多个实现,而必须成为依赖项注入过程的一部分时,它很有用,因为它具有必须由框架注入的依赖项。     
        我知道为什么Google会做他们所做的事情,但是拥有某些东西的首选实现并不一定是邪恶的。请注意,文档说这是默认实现,而不是唯一的实现。 顺便说一句,我发现了这个问题,因为我正在Internet上搜索@ImplementedBy概念的现有实现。 我创建了一个名为@ImplementedBy的批注,以放置在我的界面之一上。当使用纯的,非注入的反射时,这是告诉接口使用哪种实现的最简单方法,尤其是在使用仅了解接口的现有API时。 (接口,不是实现) 注释使我能够使用装饰器中的一行注释和一行一行的注释来泛化一些非常粗糙的生成器。我不必为这种简单的操作使用依赖框架。     
        对我来说,是的,如果您使用它进行硬线绑定并且永远不会重复使用绑定,那是很邪恶的,因为您颠倒了界面的含义。我同意@thSoft的观点,这是一个非常常见的模式,但我什至不知道为什么我们没有
@Implements
注释。 同样令人恼怒的是,给定的默认实现不是运行时使用的默认实现。 只是为了清楚起见,谷歌说了些什么
Annotate types tell the injector what their default implementation type is. …
!!它还消除了通用接口,例如
@ImplementedBy(MyImpl.class)
public interface MyInterface<SIn,SOut> {}

public class MyImpl implements MyInterface<String, Integer> {}
通常不会只实施一次。 有关详细信息,请参见使用Guice注入通用实现。     

要回复问题请先登录注册