2011-07-04 14 views
0

Guiceを使用して次の作業を行うにはどうすればよいですか?カスタム注釈のインスタンスに特定のパラメータをバインドするにはどうすればよいですか?

// The Guice Module configuration 
void configure() { 
    // The following won't compile because HelpTopicId is abstract. 
    // What do I do instead? 
    bind(new TypeLiteral<String>(){}). 
     annotatedWith(new HelpTopicId("A")).toInstance("1"); 
    bind(new TypeLiteral<String>(){}). 
     annotatedWith(new HelpTopicId("B")).toInstance("2"); 
} 

public @interface HelpTopicId { 
    public String helpTopicName(); 
} 

public class Foo { 
    public Foo(@HelpTopicId("A") String helpTopicId) { 
    // I expect 1 and not 2 here because the actual parameter to @HelpTopicId is "A" 
    assertEquals(1, helpTopicId); 
    } 
} 

答えて

1

これを行う最も簡単な方法は、@Provides方法を用いることであろう。注釈にhashCode()のようなものがどのように実装されているかについての特別な規則があることに注意してください。... NamedImplこれらの規則に従います。

また、new TypeLiteral<String>(){}を使用すると、無駄です。String.classをその場所で使用することができます。さらに、String,intなどの場合は、通常bind(String.class)の代わりにbindConstant()を使用する必要があります。簡単ですが、バインディングアノテーションを提供する必要があり、プリミティブ、StringClassリテラル、enumに制限されています。

0

コンストラクタFoo(String)@Injectで注釈を付ける必要があります。

独自のHelpTopicId注釈を使用する代わりに、Guice Named注釈で試してください。

void configure() { 
    bind(new TypeLiteral<String>(){}).annotatedWith(Names.named("A")).toInstance("1"); 
    bind(new TypeLiteral<String>(){}).annotatedWith(Names.named("B")).toInstance("2"); 
} 

public class Foo { 
    @Injected 
    public Foo(@Named("A") String helpTopicId) { 
    assertEquals("1", helpTopicId); 
    } 
} 

あなたが@Namedインタフェースの独自の実装を展開したい場合は、パッケージcom.google.inject.nameでGuiceのの実装を見てみましょう。

@Provides @HelpTopicId("A") 
protected String provideA() { 
    return "1"; 
} 

また、あなたがNames.namedの実装(NamedImplを参照)に似てHelpTopicId注釈/インターフェースのインスタンス化の実装を作成することができます。おそらく

+0

有効なポイントは...まだ、 'configure()'のコードはコンパイルされません。 – ripper234

+0

私はちょうど試したことがあり、 'configure()'の上書きされたメソッドはうまくコンパイルされています。コンパイラが提供しているメッセージは何ですか? –

+0

ああ、申し訳ありませんが、私は自分の利益のためには速すぎました。私は特に名前付きのものではなくカスタムアノテーションについて尋ねました(私はそれらに精通しています)。 – ripper234