Guice:如何注入接口的默认实现的实例?

时间:2015-08-05 13:53:04

标签: java dependency-injection guice

我有一个具有默认实现和特定于客户端的实现的接口。

接口:

@ImplementedBy(CoreServiceImpl.class)
interface CoreService {
  // Methods
}

默认实施:

class CoreServiceImpl implements CoreService {
  // Methods
}

在我的特定Guice模块中,我使用了不同的实现:

模块:

...
bind(CoreService.class).to(ClientSpecificServiceImpl.class);
...

实现:

class ClientSpecificServiceImpl implements CoreService {
  // Methods
}

但是,在这个类中,我需要一个默认实现的实例。

如何告诉Guice“注入此接口的默认实现的实例”?

我可以按类型名称引用当前默认实现,例如

class ClientSpecificServiceImpl implements CoreService {

  private final CoreServiceImpl coreServiceImpl;

  @Inject
  ClientSpecificServiceImpl(CoreServiceImpl coreServiceImpl) {
    this.coreServiceImpl = coreServiceImpl;
  }
}

..但如果默认实现(@ImplementedBy内部的那个)发生了变化,我就不会接受更改。这应该通过反思来完成吗?还有更好的方法吗?

1 个答案:

答案 0 :(得分:3)

如果要在不同位置注入不同的实现,请使用注入注释。换句话说,对于一个客户:

class ClientSpecificApp {
  private final CoreService coreService;

  @Inject
  ClientSpecificServiceImpl(@Named("clientName") CoreService coreService) {
    this.coreService = coreService;
  }
}

对于其他人:

class DefaultApp {
  private final CoreService coreService;

  @Inject
  DefaultApp(CoreService coreService) {
    this.coreService = coreService;
  }
}

然后,在Guice模块中绑定该注释:

protected void configure() {
    bind(CoreService.class).annotatedWith(Names.named("clientName") CoreService);
}

然后,您需要做的就是更改模块中针对特定于客户端的版本的绑定(如果它发生更改)。

进一步阅读:Binding Annotations