Spring 什么时候应该使用绑定注释与更具体的接口? 问题:
在决定以下各项时,应使用什么标准:Spring 什么时候应该使用绑定注释与更具体的接口? 问题:,spring,dependency-injection,guice,jsr330,Spring,Dependency Injection,Guice,Jsr330,在决定以下各项时,应使用什么标准: 使用注释指定依赖项,以及 使用更具体的接口指定依赖项 例子 假设我有: interface FooLoader { Foo loadById(long id); } class DBFooLoader implements FooLoader { ... jdbc etc. etc. ... } class CachingFooLoader implements FooLoader { ... @Inject p
- 使用注释指定依赖项,以及
- 使用更具体的接口指定依赖项
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;
}
...
}
假设我想将傻瓜加载程序
绑定到CachingFooLoader
,我[至少]有两种方法来连接它:
使用注释绑定
更改:
public CachingFooLoader(FooLoader delegate)
public CachingFooLoader(FooLoader delegate)
致:
然后:
bind(FooLoader.class).annotatedWith(NonCaching.class).to(DBFooLoader.class);
创建更具体的接口
更改:
public CachingFooLoader(FooLoader delegate)
public CachingFooLoader(FooLoader delegate)
致:
其中,nonachingooloader
只是扩展dougloader
,然后让dbdougloader
实现nonachingooloader
,并相应地连接起来
我的想法
出于多种原因,我喜欢使用注释绑定:
- 键比接口更容易重用,这减少了接口可能遭受的组合爆炸。
- 它入侵性较小:配置停留在Guice模块中,而不是“中毒”类。
- 接口更有意义。通常只有Guice会读取注释,其中as接口用于更多的用途
(据我所知,Spring用户就是你们所说的限定词。)仅在合理的情况下使用特定接口,即他们必须提供不同的API,因此其他类将以特定的方式使用它们 如果它们以不同的方式提供相同的“服务”,则只使用一个公共接口,并使用注释区分实现