Just-in-time绑定

该绑定由Guice自动创建


Just-in-time绑定

当注入器需要一个类型的实例时,它首先需要寻找绑定。在modules中定义的绑定被称为显式绑定(explici bindings),注入器在有显式绑定时就会使用它。但是如果一个类型没有对应的显式绑定,那么注入器就会尝试创建一个Just-In-Time绑定。Just-in-time绑定也被称为JIT绑定或隐式绑定。

可注入的构造器

Guice可以使用具体类型的可注入构造器(injectable constructor)来为其创建绑定。可注入构造器必须是非private的无参构造器或带有@Inject注解的构造器。(下面的例子就是一个带有@Inject的可注入构造器)

public class PayPalCreditCardProcessor implements CreditCardProcessor {
  private final String apiKey;

  @Inject
  public PayPalCreditCardProcessor(@Named("PayPal API key") String apiKey) {
    this.apiKey = apiKey;
  }

对于嵌套类而言,Guice只有在嵌套类被static修饰时才会允许注入。内部类由于有一个隐含的指向包含类的引用,因此无法被Guice注入。(Why?)

@ImplementedBy

该注解通过在类型上进行标记来告诉注入器该类型的默认实现。@ImplementedBy注解与关联绑定的作用是一样的,都是通过指定一个具体的子类来构造一个绑定。

@ImplementedBy(PayPalCreditCardProcessor.class)
public interface CreditCardProcessor {
  ChargeResult charge(String amount, CreditCard creditCard)
      throws UnreachableException;
}

上面的注解与关联绑定中的bind()语句是等价的:

bind(CreditCardProcessor.class).to(PayPalCreditCardProcessor.class);

如果一个类型即有bind()绑定也有@ImplementedBy绑定,那么Guice将优先使用bind()绑定。也就是说@ImplementedBy注解为类型绑定了一个默认的实现,bind()语句可以覆盖这个默认值。需要注意的是,由于@ImplementedBy注解在编译期引入了接口到实现的依赖,因此使用时需要权衡利弊。

@ProvidedBy

@ProvidedBy注解表明该类是一个提供实例的Provider类:

@ProvidedBy(DatabaseTransactionLogProvider.class)
public interface TransactionLog {
  void logConnectException(UnreachableException e);
  void logChargeResult(ChargeResult result);
}

该注解等价于toProvider()绑定的方式:

bind(TransactionLog.class)
        .toProvider(DatabaseTransactionLogProvider.class);

类似的,如果同时指定了@ProvidedBybind(),那么Guice会优先使用bind()绑定的实例类型。

results matching ""

    No results matching ""