Guice的依赖注入可实现同一接口的几种实现

时间:2018-06-21 08:36:57

标签: java dependency-injection guice

我想尝试在项目中使用Guice,并停留在简单的问题上(从我的角度来看)。

假设我有界面

public interface TradeService {
        public boolean buy(Player player, ProductID productId);
}

具有几种依赖关系的实现:

 public CarsTradeService implements TradeService {
      //...implementation here...
    }

    public BoatsTradeService implements TradeService {
      //...implementation here...
    }

    public AirplanesTradeService implements TradeService {
      //...implementation here...
    }

我了解如何配置实现并为其提供所需的依赖关系-为此,我需要创建看起来像

的guice "modules"
public class CarsTradeModule extends AbstractModule {
    @Override 
    protected void configure() {
     bind(TradeService.class).to(CarsTradeService.class).in(Singleton.class);
    }
}

和类似的模块可以休息两个服务。好的,模块已构建。但是后来,当我需要将此实现注入某个类时,我该如何注入确切需要的实现?

例如,如果我需要获取CarsTradeService的实例-我该如何确切地获取此实例?

2 个答案:

答案 0 :(得分:2)

您可以使用annotatedWith和@Named来做到这一点。

bind(TradeService.class).annotatedWith(Names.named("carsTradeService")).to(CarsTradeService.class).in(Singleton.class);

在要注入该bean的类中,您需要使用

@Inject
@Named("carsTradeService")
private TradeService tradeService;

这将注入您需要的确切课程。

答案 1 :(得分:1)

您可以使用guice多重绑定。这是一个guice扩展。

https://github.com/google/guice/wiki/Multibindings

@Override
public void configure() {
  Multibinder.newSetBinder(binder(),TradeService.class)
  .addBinding()
  .to(CarsTradeService.class);

  Multibinder.newSetBinder(binder(),TradeService.class)
  .addBinding()
  .to(BoatsTradeService.class);

  Multibinder.newSetBinder(binder(),TradeService.class)
  .addBinding()
  .to(AirplanesTradeService.class);
}