Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 什么时候应该使用绑定注释与更具体的接口? 问题:_Spring_Dependency Injection_Guice_Jsr330 - Fatal编程技术网

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,因此其他类将以特定的方式使用它们

如果它们以不同的方式提供相同的“服务”,则只使用一个公共接口,并使用注释区分实现