Java – dependency injection is condition based
•
Java
I'm using Google Guice for dependency injection Suppose I have the following points:
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(); } }
Next is a very simple binding module, like this:
public class MyModule extends AbstractModule { @Override protected void configure() { bind(Payment.class).to(PaymentCashImpl.class); } }
As you can see, the payment instance is injected into the order constructor This is done in the mymodule class. Overall, it's really cool
My main looks like:
public static void main(String[] args) { MyModule module = new MyModule(); Injector injector = Guice.createInjector(module); Order order = injector.getInstance(Order.class); order.finishOrder(); }
What I don't see, however, is how I can combine some way to conditionally bind paymentcardimpl or paymentcashimpl instances to the order constructor
For example, an order is an "online" order I will need to do this:
bind(Payment.class).to(PaymentCardImpl.class);
What's the best way to do it? I'm new here
Solution
You can comment which one to inject If you make a named binding, it will solve the problem
See below:
bind(Payment.class).annotatedWith(Names.named("Card")).to(PaymentCardImpl.class); bind(Payment.class).annotatedWith(Names.named("Cash")).to(PaymentCashImpl.class);
Then you want to inject what you do:
@Named("Cash") Payment payment
or
@Named("Card") Payment payment
The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
二维码