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);
类似的,如果同时指定了@ProvidedBy
和bind()
,那么Guice会优先使用bind()
绑定的实例类型。