アノテーションで名前付け
アノテーションを使用して、サービスインターフェイスと実装を名前付きで関連づけます。
- 識別用アノテーションには、@BindingAnnotationを設定します。(設定しないとエラーになります)
- Moduleで、annotatedWith()またはKeyを利用して、名前付きでインスタンスとインターフェイスを関連づけます。
- インジェクション先に、@Injectと識別用アノテーションを設定します。
サンプル:
// サービスインターフェイス static interface Kitten { void meow(); } // サービスの実装。名前+":meow!"を出力する。 static class KittenImpl implements Kitten { final String name; KittenImpl ( String name ) { this.name = name; } public void meow() { System.out.println( name + " : meow!" ); } } // インジェクション先のインスタンス static class Master { // インジェクション先フィールド。 // @Injectと識別用のアノテーションを設定。 @Inject @Kuro Kitten kuro; Kitten mii; // インジェクション先メソッド。 // @Injectと識別用のアノテーションを引数に設定。 @Inject void setMii( @Mii Kitten mii ) { this.mii = mii; } void call() { kuro.meow(); mii.meow(); } } // 識別用のアノテーション // @BindingAnnotation はGuice組み込みのアノテーションで、 // このアノテーションがインジェクション先の識別用であることを示す。 // 未設定のアノテーションを識別用に使用するとエラーになるので注意。 @Retention( RetentionPolicy.RUNTIME ) @Target( { ElementType.PARAMETER} ) @BindingAnnotation static @interface Mii {} @Retention( RetentionPolicy.RUNTIME ) @Target( { ElementType.FIELD} ) @BindingAnnotation static @interface Kuro {} // メイン public static void main( String[] args ) throws Exception { Injector injector = Guice.createInjector( new AbstractModule() { @Override protected void configure ( ) { // 識別用アノテーション付けて登録 bind( Kitten.class ).annotatedWith( Mii.class ) .toInstance( new KittenImpl("mii") ); bind( Key.get( Kitten.class, Kuro.class ) ) // Keyを利用してもOK .toInstance( new KittenImpl("kuro") ); } }); injector.getInstance( Master.class ).call(); }
出力:
kuro : meow! mii : meow!