Android RoboGuice使用マニュアル(10):Just-in-time Bindings


Injectorはbindings定義を確認することによって、あるタイプのインスタンスオブジェクトを作成します.Moduleで定義バインディングを「明示的宣言バインディング(Explicit bindings)」と呼びます.Injectorは、まずExplicit Bindingsを使用して、あるタイプのインスタンスオブジェクトを作成します.ただし、あるタイプがバインディングを明確に定義していない場合、Injectorは「インスタントバインディング(Just-in-time Bindings)、JIT Bindingsも暗黙的バインディング(implicit bindings)にしようとします.
Eligible Constructor
Injectorは、クラスのinjectable constructorを使用してクラスのインスタンスオブジェクトを作成します.injectable constructorは、クラスに定義されたpublicのパラメータを持たないコンストラクション関数または@Injectorタグを持つコンストラクション関数であってもよい.
例えばAndroid RoboGuice使用マニュアル(4):Linked BindingsにおけるMyRectangleの無パラメータ構造関数:
public class MyRectangle extends Rectangle{
 public MyRectangle(){
 super(50,50,100,120);
 }
 ...
}

とAndroid RoboGuice使用マニュアル(6):Instance Bindings定義@Injectorタグを含むコンストラクション関数:
public class MySquare extends MyRectangle {
 @Inject public MySquare(@Named("width") int width){
 super(width,width);
 }
}

 
@ImplementedBy
 
     Injector         ,    Linked Bindings   ,  :

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

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

 
同等.@ImplementedByとbind定義が同時に含まれるタイプの場合、bindの定義が優先されます.
注意:@ImplementedByはInterfaceから実装への依存を定義しており、一般的には推奨されません.
@ProvidedBy
@ProvidedByは、デフォルトのProviderを使用してインスタンスオブジェクトを作成するタイプをInjectorに通知します.たとえば、次のようにします.
@ProvidedBy(DatabaseTransactionLogProvider.class)
public interface TransactionLog {
 void logConnectException(UnreachableException e);
 void logChargeResult(ChargeResult result);
}

次のBindingと同等です.
bind(TransactionLog.class)
 .toProvider(DatabaseTransactionLogProvider.class);

 
@ImplementedByと同様に、@ProvidedByとbindが同時に定義されている場合は、モジュールで定義されているbindが優先されます.