什么时候应该使用绑定注释和更具体的接口?

时间:2011-10-06 20:08:05

标签: spring dependency-injection guice jsr330

问题

在决定之间应该使用什么标准:

  • 使用注释指定依赖项,和
  • 使用更具体的接口指定依赖项

实施例

假设我有:

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只是扩展FooLoader,然后DBFooLoader实施NonCachingFooLoader,并相应地连接。

我的想法

由于多种原因,我习惯使用注释绑定:

        
  • 键可以比接口更容易重用,从而减少接口可能遭受的组合爆炸。     
  • 它的侵入性较小:配置保留在Guice模块中,而不是“中毒”类。

但是,创建更具体的界面也有其优势:

        
  • 界面有更多意义。通常只有Guice会读取注释,其中接口用于更多。

那么,应该使用什么标准来确定采取哪种方法?

(据我所知,春季用户,这就是你们所谓的限定词。)

1 个答案:

答案 0 :(得分:1)

如果有意义,请使用特定界面 ,即他们必须提供不同的API,因此其他类将以特定方式使用它们。

如果他们以不同的方式提供相同的“服务”,那么只使用一个通用接口,并通过注释区分实现。