加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 依赖注入基于条件

发布时间:2020-12-14 16:41:11 所属栏目: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 PaymentCashIm
我正在使用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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读