前編では、
応用編
応用編では、
DIの設定
方法その1-依存性をアノテーションで指定する
GuiceによるDIの設定は、
具体的には、
// インターフェースPlayにPlayImplを対応させる
// (注入する依存性の設定)
@ImplementedBy( PlayImpl.class )
public interface Play {
void play();
}
方法その2-注入の対象に名前をつける
依存性を注入する対象が複数存在するときには、
class Exam {
@Inject public Exam() {}
@Inject @Named("perfect") int perfect; // 満点
@Inject @Named("high") int high; // 高得点
@Inject @Named("passing") int passing; // 合格点
}
@Namedによって名前をつけられた対象に依存性を注入する場合は、
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()メソッドと、
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が引数で渡されますが、
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++ ) );
}
}
サーブレット(Webアプリケーション)での利用
執筆時点では、
有効にするには、
<filter>
<filter-name>Guice Servlet Filter</filter-name>
<filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Guice Servlet Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
サーブレットでGuiceを利用すると、
HttpServletRequest request =
injector.getInstance( HttpServletRequest.class );
または
ServletRequest request =
injector.getInstance( ServletRequest.class );
このため、
これを実現するには、
Injector injector = Guice.createInjector( new AbstractModule() {
protected void configure() {
install( new ServletModule() );
// ..... その他のDI設定 .....
}
});
また、
@Inject @RequestParameters Map<String, String[]> params;
おわりに
Googleのエンジニアにより開発されたDIフレームワークGuiceについて紹介しましたが、
なお、