问题
在做出以下决定时应使用哪些标准:
- 使用注释指定依赖项,以及
- 使用更具体的接口指定依赖项
例子
假设我有:
interface FooLoader {
Foo loadById(long id);
}
class DBFooLoader implements FooLoader {
... jdbc etc. etc. ...
}
class CachingFooLoader implements FooLoader {
...
@Inject
public CachingFooLoader(FooLoader delegate) {
this.delegate = delegate;
}
...
}
假设我想绑定FooLoader
到CachingFooLoader
,我有[至少]两种方式来连接它:
使用注解绑定
改变:
public CachingFooLoader(FooLoader delegate)
到:
public CachingFooLoader(@NonCaching FooLoader delegate)
进而:
bind(FooLoader.class).annotatedWith(NonCaching.class).to(DBFooLoader.class);
创建更具体的界面
改变:
public CachingFooLoader(FooLoader delegate)
到:
public CachingFooLoader(NonCachingFooLoader delegate)
在哪里NonCachingFooLoader
简单地 extends FooLoader
,然后有DBFooLoader
implement NonCachingFooLoader
,并相应地连接起来。
我的想法
出于多种原因,我被吸引到使用注释绑定:
- 键比接口更容易重用,这减少了接口可能遭受的组合爆炸。
- 它侵入性较小:配置保留在 Guice 模块中,而不是“中毒”类。
但是,创建更具体的界面也有其优点:
- 接口有更多的意义。通常只有 Guice 会读取注释,而接口的用途更多。
那么,应该使用什么标准来确定采用哪种方法呢?
(Spring 用户,据我所知,这就是你们所说的限定符。)