使用 Guice 为同一接口的多个实现进行依赖注入

Dependency injection with Guice for several implementations of same interface

我想尝试在我的项目中使用 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);
    }
}

和其余两个服务类似的模块。好的,模块构建。但后来,当我需要将此实现注入某些 class - 我如何注入完全需要的实现?

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

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

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

并且在 class 中你想注入这个你需要使用的 bean

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

这将准确注入您需要的class。

您可以使用 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);
}