名前付きバインディング
Guice組み込みのNamedアノテーションを利用して、サービスインターフェイスと実装を名前付きで関連づけます。
- Moduleで「インターフェイス+名前」と、実装を関連づけ。(Names#namedはNamedアノテーションを生成するユーティリティです。)
- インスタンス取得時も同様に、「インターフェイス+名前」を指定して実装を取得します。
サービスのインターフェイス:
import com.google.inject.ImplementedBy; /** * サービスのインターフェイス */ interface Kitten { void meow (); }
サービスの実装:
/** * サービスの実装 */ class KittenImpl implements Kitten { final String name; KittenImpl ( String name ) { this.name = name; } public void meow () { System.out.println( name + " : meow!" ); } }
利用サンプル:
Injector injector = Guice.createInjector( new AbstractModule() { @Override protected void configure ( ) { // 名前付きで登録 bind( Key.get( Kitten.class, Names.named( "mii" ) ) ) .toInstance( new KittenImpl("mii") ); bind( Key.get( Kitten.class, Names.named( "kuro" ) ) ) .toInstance( new KittenImpl("kuro") ); } }); // 型と名前を指定して取得。 Kitten mii = injector.getInstance( Key.get( Kitten.class, Names.named( "mii" ) ) ); mii.meow(); Kitten kuro = injector.getInstance( Key.get( Kitten.class, Names.named( "kuro" ) )); kuro.meow();
出力:
mii : meow! kuro : meow!
名前付きのインスタンスのインジェクション
名前付きのインスタンスをインジェクションする場合は、インジェクション先にNamedアノテーションを記述します。Namedアノテーションの属性として「名前」を指定します。
インジェクション先:
import com.google.inject.Inject; import com.google.inject.name.Named; public class Master { // インジェクション先のフィールド // "mii"の名前付きKittenがインジェクションされる。 @Inject @Named("mii") Kitten mii; // メソッドインジェクションされるフィールド Kitten kuro; // インジェクション用メソッド // "kuro"の名前付きKittenがインジェクションされる。 @Inject void setKuro( @Named("kuro") Kitten kuro ) { this.kuro = kuro; } public void call () { mii.meow(); kuro.meow(); } }
利用サンプル:
Injector injector = Guice.createInjector( new AbstractModule() { @Override protected void configure ( ) { // 名前付きで登録 bind( Key.get( Kitten.class, Names.named( "mii" ) ) ) .toInstance( new KittenImpl("mii") ); bind( Key.get( Kitten.class, Names.named( "kuro" ) ) ) .toInstance( new KittenImpl("kuro") ); } }); injector.getInstance(Master.class).call();
出力:
mii : meow! kuro : meow!
追記 (07-05-22)
Namedアノテーションを利用した方法はGuiceでは推奨されていません。(→ Java on Guice Guice 1.0 User's Guideの Binding to Strings の項を参照)
- スペルミスをしがち
- 開発ツールに優しくない
という理由で、独自にアノテーションを作成して名前を付ける方法が推奨されています。でも、どう考えてもめんどい気が。(という人のためにNamedが用意されているみたいですが。)