我想尝试在项目中使用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
的实例-我该如何确切地获取此实例?
答案 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);
}