java – 依赖注入基于条件

前端之家收集整理的这篇文章主要介绍了java – 依赖注入基于条件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用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
原文链接:https://www.f2er.com/java/124623.html

猜你在找的Java相关文章