我正在使用Google Guice进行依赖注入.假设我有以下几点:
public interface Payment { public void pay(); } public class PaymentCardImpl implements Payment { public void pay() { System.out.println("I pay with a card"); } } public class PaymentCashImpl implements Payment { public void pay() { System.out.println("I pay cash"); } } public class Order { private Payment payment; @Inject public Order(Payment payment){ this.payment=payment; } public void finishOrder(){ this.payment.pay(); } }
接下来就是一个非常简单的绑定模块,就像这样:
public class MyModule extends AbstractModule { @Override protected void configure() { bind(Payment.class).to(PaymentCashImpl.class); } }
您可以看到,Payment实例被注入到Order构造函数中.这是在MyModule类中完成的,总体来说真的很酷.
我的主要看起来像:
public static void main(String[] args) { MyModule module = new MyModule(); Injector injector = Guice.createInjector(module); Order order = injector.getInstance(Order.class); order.finishOrder(); }
然而,我看不到的是,我如何可以结合某种方式来有条件地将PaymentCardImpl或PaymentCashImpl实例绑定到Order构造函数.
比方说,订单是“在线”订单.我会需要这样做:
bind(Payment.class).to(PaymentCardImpl.class);
最好的方式是做什么?我是新来的依赖注入.
解决方法
您可以注释要注入哪一个.如果你做一个命名的绑定,它将解决问题.
见下文:
bind(Payment.class).annotatedWith(Names.named("Card")).to(PaymentCardImpl.class); bind(Payment.class).annotatedWith(Names.named("Cash")).to(PaymentCashImpl.class);
然后你想注射你做:
@Named("Cash") Payment payment
要么:
@Named("Card") Payment payment