前編では,
応用編
応用編では,
DIの設定
方法その1-依存性をアノテーションで指定する
GuiceによるDIの設定は,
具体的には,
リスト5 インターフェースに対応するされる具象クラス(依存性)をアノテーションで指定
// インターフェースPlayにPlayImplを対応させる
// (注入する依存性の設定)
@ImplementedBy( PlayImpl.class )
public interface Play {
void play();
}
方法その2-注入の対象に名前をつける
依存性を注入する対象が複数存在するときには,
リスト6 注入の対象に@Namedで名前をつけた
class Exam {
@Inject public Exam() {}
@Inject @Named("perfect") int perfect; // 満点
@Inject @Named("high") int high; // 高得点
@Inject @Named("passing") int passing; // 合格点
}
@Namedによって名前をつけられた対象に依存性を注入する場合は,
リスト7 名前をつけられた対象に定数を設定
Injector injector = Guice.createInjector( new AbstractModule() {
protected void configure() {
bind( int.class ).annotatedWith( named( "perfect" ) ).toInstance( 100 );
bind( int.class ).annotatedWith( named( "high" ) ).toInstance( 80 );
bind( int.class ).annotatedWith( named( "passing" ) ).toInstance( 60 );
}
});
Exam exam = injector.getInstance( Exam.class );
方法その3 - Providerによるインスタンスの生成
先ほどまでの例では,
たとえば通販サイトを想定して,
先にInjectorとモジュールを見てみましょう(リスト8)。toProvider()メソッドと,
リスト8 Provider(OrderProvider)が用いられるInjectorの生成
Injector injector = Guice.createInjector( new AbstractModule() {
protected void configure() {
bind( Order.class ).toProvider( new OrderProvider( 1 ) );
}
});
OrderProviderクラスはリスト9のように作成しました。インスタンスの生成はget()メソッドで行われます。このメソッドの戻り値の型とProvider<Order>における<Order>の部分とが同じでなければなりません。この部分は<T>のようにテンプレート型で表すこともできます。その場合はget()メソッドの戻り値もT型として宣言します。
リスト9ではCartのコンストラクタに付与されたIDが引数で渡されますが,
リスト9 Orderインスタンスを生成するProviderクラス(OrderProvider)
class OrderProvider implements Provider<Order> {
int id = 0;
public OrderProvider( int id ) { this.id = id; }
public Order get() {
// CartインスタンスにIDを付与している
return new Order( new Cart( id++ ) );
}
}