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

rip*_*234 15 java guice

我听说过" @ImplementedBy是邪恶的",理由是它打破了DI概念并让界面意识到它的实现者.

在某些情况下可能会出现这种情况,但我经常发现它只会导致更清晰的代码(没有很长的模块可以维护),而不会真正伤害过程中的任何内容.

作为语用学,而不是纯粹主义者,你认为什么时候使用@ImplementedBy是值得的?

Dea*_*ler 12

我和@ImplementedBy同时感受到了同样的呃,ick,yuck的感觉,它非常有用.Spring必须扫描你提供的包列表中的所有类.在Guice中,您不必配置要扫描的包列表,@ ImplementedBy是关键(如果不使用Binder进行绑定).当它在第一个Injector.getInstance上关闭你的对象heirarchy,然后命中一个接口,它然后使用@ImplementedBy找到默认实现(只要Binder中没有任何内容覆盖该默认值).

我们也使用@ImplementedBy.我们发现使用它非常好,它有点呃,但它只是工作和工作很好,因为它是DI,它实际上并不依赖于实现,因为你可以用新的方式覆盖绑定.

同时,DI框架通常越来越少地使用接口.所有DAO接口都在我们的项目上消失了,我们仍然可以为DAO交换模拟对象.java类是隐含的接口,可以在不需要接口的情况下进行模拟.我们现在保留主api的接口使用非常清晰,并且不会使用实现代码混乱.对于DAO,我们不再需要它了.


Jes*_*son 10

您通常应该优先考虑对实时(JIT)绑定的显式绑定.显式绑定允许注入器在注入器创建时爬行依赖图.如果依赖项缺失或无效,这允许Guice快速失败.使用像@ImplementedBy这样的即时绑定,Guice无法在执行绑定之前报告问题.

JIT绑定与PrivateModules /子注入器的交互也很差.虽然大多数应用程序不应该需要这些功能,但是当您执行此操作时,如果每个绑定都属于特定模块,则不会那么痛苦.


thS*_*oft 5

当一个接口不打算具有多个实现,而必须成为依赖项注入过程的一部分时,它很有用,因为它具有必须由框架注入的依赖项。