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